Long을 정수로 변환


답변:


500
Integer i = theLong != null ? theLong.intValue() : null;

또는 null에 대해 걱정할 필요가없는 경우 :

// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;

두 경우 모두 Long은 정수보다 넓은 범위를 저장할 수 있기 때문에 오버플로가 발생할 수 있습니다.

Java 8에는 오버플로를 검사하는 도우미 메서드가 있습니다 (이 경우 예외가 발생 함).

Integer i = theLong == null ? null : Math.toIntExact(theLong);

5
NULL 값을 처리하기 때문에 가장 좋은 대답입니다.
Viacheslav Dobromyslov 1

3
@ ViacheslavDobromyslov 문제는 null 값이 아니라 Long 값에 관한 것입니다. 그리고 개인적으로 나는 null in-> null out을 사용하는 대신 null up을 거부하여 응용 프로그램을 통해 null을 전송한다고 생각합니다. 그래서 이것은 또한 이것이 최악의 대답이라고 주장 할 수 있습니다 :-)
Sean Patrick Floyd

1
intValue대신 전화 할 수 있는데 왜 두 번이나 캐스팅 하시겠습니까? 게다가 그것은 unbox to long, cast to int 및 rebox to로 갈 Integer것입니다. 매우 유용하지는 않습니다. 나는 머리 꼭대기에 요점이 보이지 않습니다. 이것에 대한 충분한 이유가 있습니까?
Dici

나는 오류가 점점 오전 : 수없는 원시적 형에있는 intValue ()를 호출 긴
아난드

1
@Thilo 오, 알 겠어. 기본적으로 당신은 변환하고 Longlong처음 다음에int
MR ID를

123

다음과 같은 세 가지 방법이 있습니다.

Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;

세 버전 모두 거의 동일한 바이트 코드를 생성합니다.

 0  ldc2_w <Long 123> [17]
 3  invokestatic java.lang.Long.valueOf(long) : java.lang.Long [19]
 6  astore_1 [l]
 // first
 7  aload_1 [l]
 8  invokevirtual java.lang.Long.intValue() : int [25]
11  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
14  astore_2 [correctButComplicated]
// second
15  aload_1 [l]
16  invokevirtual java.lang.Long.intValue() : int [25]
19  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
22  astore_3 [withBoxing]
// third
23  aload_1 [l]
// here's the difference:
24  invokevirtual java.lang.Long.longValue() : long [34]
27  l2i
28  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
31  astore 4 [terrible]

12
사소한 스타일러스 문제 : 123L가독성을 위해 대문자 접미사 를 사용해야합니다 .
Joey

또는 당신은 좋은 글꼴을 사용할 수 있습니다 ... 그리고 여기에 우리가 다시 간다 ... : D (J / K, 나는 또한 그렇게)
davidcsb

@ViacheslavDobromyslov 사실입니다. 문제는 null이 아닌 Long에 관한 것입니다
Sean Patrick Floyd

2
@SeanPatrickFloyd p. Long 변수 값이 때로는 NULL 일 수 있다는 것을 잊지 마십시오.
Viacheslav Dobromyslov

2
@ user64141 Java에서 타입 캐스팅은 복잡한 문제입니다. 실제로 객체를 변경하지 않고 다른 방식으로 동일한 객체를 바라보기 때문에 객체 캐스팅이 좋습니다. 그러나이 경우 구문에서 다른 기본 요소를 암시하더라도 Object에서 Primitive, Autoboxing의 광기를 통해 다시 이의를 제기하는 의미있는 캐스트 체인이 있습니다. 나에게 이것은 복싱과 원시적 전환의 오용이다. 수행 할 수있는 모든 것을 수행해야하는 것은 아닙니다.
Sean Patrick Floyd


20

오버플로를 확인하고 Guava를 편리하게 사용하려면 다음이 있습니다 Ints.checkedCast().

int theInt = Ints.checkedCast(theLong);

구현 은 간단하고 오버플로에서 IllegalArgumentException 을 발생시킵니다.

public static int checkedCast(long value) {
  int result = (int) value;
  checkArgument(result == value, "Out of range: %s", value);
  return result;
}

8

캐스트를 입력해야합니다.

long i = 100L;
int k = (int) i;

long은 int보다 큰 범위를 가지므로 데이터가 손실 될 수 있습니다.

박스형에 대해 이야기하고 있다면 설명서 를 읽으십시오 .


6

Java 8을 사용하는 경우 다음과 같이하십시오.

    import static java.lang.Math.toIntExact;

    public class DateFormatSampleCode {
        public static void main(String[] args) {
            long longValue = 1223321L;
            int longTointValue = toIntExact(longValue);
            System.out.println(longTointValue);

        }
}

5

가장 간단한 방법은 다음과 같습니다.

public static int safeLongToInt( long longNumber ) 
    {
        if ( longNumber < Integer.MIN_VALUE || longNumber > Integer.MAX_VALUE ) 
        {
            throw new IllegalArgumentException( longNumber + " cannot be cast to int without changing its value." );
        }
        return (int) longNumber;
    }

4

Java 8에서는을 사용할 수 있습니다 toIntExact. null값 을 처리 하려면 다음을 사용하십시오.

Integer intVal = longVal == null ? null : Math.toIntExact(longVal);

이 메소드의 좋은 점은 ArithmeticException인수 ( long)가을 오버플로하는 경우 if를 던진다는 것 int입니다.


3

널이 아닌 longVal이라고 가정

Integer intVal = ((Number)longVal).intValue();

예를 들어 정수 또는 Long 일 수있는 Object를 얻습니다. 나는 그것이 추악하다는 것을 알고 있지만 일어난다 ...


2

toIntExact (long value)를 사용하면 long 인수의 값을 반환하고 값이 int에 오버플로되면 예외를 발생시킵니다. API 레벨 24 이상에서만 작동합니다.

int id = Math.toIntExact(longId);

0

장기 방문자 = 1000;

int convVisitors = (int) 방문자;


-2

자바에서는 long을 int로 변환하는 엄격한 방법이 있습니다.

lnog는 int로 변환 할 수있을뿐만 아니라 모든 유형의 클래스 확장 Number는 일반적으로 다른 Number 유형으로 변환 할 수 있습니다. 여기서 long을 int로 변환하는 방법을 보여 주며 다른 유형도 그 반대로 변환합니다.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

15
난 당신이 추상적 인 공장 어딘가를 생성하는 것을 잊었다 생각
user541686을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.