JavaRush /Java Blog /Random-KO /커피 브레이크 #163. 람다와 메소드 참조의 차이점은 무엇입니까? Java에서 문자열 Null을 연결...

커피 브레이크 #163. 람다와 메소드 참조의 차이점은 무엇입니까? Java에서 문자열 Null을 연결하는 5가지 방법

Random-KO 그룹에 게시되었습니다

람다와 메소드 참조의 차이점은 무엇입니까

출처: Reddit IntelliJ IDEA에서는 람다 표현식을 메서드 참조로 대체할 것을 제안합니다. 그들 사이의 차이점은 무엇입니까? 커피 브레이크 #163.  람다와 메소드 참조의 차이점은 무엇입니까?  Java에서 문자열 Null을 연결하는 5가지 방법 - 1람다 표현식과 메서드 참조 사이에는 미묘한 차이가 있는 것으로 나타났습니다. 예를 들어, myInstance::getStuff() ->myInstance.getStuff() 를 비교하십시오 . 일반적으로 두 옵션은 서로 동일합니다. 그러나 myInstance가 null이고 람다가 람다를 평가할 때 null 포인터를 생성하는 경우 참조에 액세스하려고 하면 메서드 참조가 즉시 생성됩니다. 그리고 뭐? 일반적으로 람다 식을 평가하는 코드가 null 포인터가 있는 try-catch 내부에 있는 경우 이는 중요합니다. 예를 들어 다음과 같은 기능을 수행하는 mightBeNull(Supplier<T> function) 함수가 있습니다 .
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
mightBeNull (() -> myNullVariable.getStuff()) 호출이 예외를 발생시키지 않고 작동하는 경우 "동등한": mightBeNull(myNullVariable::getStuff)는 함수가 호출될 때 즉시 NullPointerException을 발생시킵니다. 그게 차이점이에요. 메모. Stackoverflow에 따르면 람다를 메서드 참조로 바꾸면 클래스 바이트코드가 더 간결해지며, 이는 클래스가 JVM에 더 빠르게 로드된다는 의미입니다. 그러나 이러한 이득을 경험하려면 수천 개의 최적화되지 않은 람다가 필요합니다. 그러나 대규모 프로젝트에서는 이러한 숫자가 쉽게 누적될 수 있습니다. 그렇지 않으면 람다와 메서드 참조 중 하나를 선택하는 것은 취향과 코드 가독성의 문제입니다. 예를 들어 람다에 여러 줄이 있으면 가독성이 떨어지며 람다가 별도의 메서드에 배치되고 이에 대한 참조가 사용되는 경우에만 코드에 이점이 있습니다.

Java에서 문자열 Null을 연결하는 5가지 방법

출처: Gitconnected 이 게시물을 읽고 나면 Java에서 문자열을 사용하는 더 많은 방법을 배우게 됩니다. Java는 문자열을 연결하는 다양한 방법을 제공하지만 때로는 null 문자열에 주의를 기울이지 않으면 분명히 우리가 원하는 것이 아닌 null이 될 수 있습니다. 따라서 문자열을 연결할 때 null 값을 방지하려면 제가 권장하는 방법을 사용하세요.

문제 분석

문자열 배열을 연결하려면 간단히 + 연산자를 사용하면 됩니다. 그러나 이 작업을 수행할 때 null 값이 발생할 수 있습니다 .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
이러한 모든 요소를 ​​결합하면 다음과 같은 결과가 나옵니다.
https://gist.github.comnull
문제를 발견했지만 결과 Null 값 도 문자열로 연결되어 있어 분명히 우리가 기대했던 것과는 다릅니다. 그리고 Java 8 이상에서 작업하는 경우에도 정적 String.join() 메서드를 사용하여 문자열을 조인하면 여전히 null 값이 생성됩니다 .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
결과는 동일합니다.
https://gist.github.comnull
그렇다면 이 문제를 해결하는 방법은 무엇입니까? 몇 가지 솔루션이 있습니다. 나중에 코드를 더 쉽게 시연할 수 있도록 문자열을 전달하고 null이 아닌 문자열을 반환할 수 있는 메서드를 추출합니다.
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. 문자열.콘캣()

String.concat()은 String 클래스 와 함께 제공되는 메서드입니다 . 문자열 연결에 매우 편리합니다.
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
nullToString() 메소드가 호출되기 때문에 결과적으로 null 값이 발생하지 않습니다 .

2.StringBuilder

StringBuilder 클래스는 문자열을 구성하는 데 유용하고 편리한 여러 메서드를 제공합니다. 그 중에서 가장 일반적으로 사용되는 것은 문자열을 연결하기 위해 append()를 사용 하고 null 값을 피하기 위해 nullToString() 메소드와 결합되는append() 메소드입니다 .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
결과적으로 다음과 같은 결과를 얻을 수 있습니다.
https://gist.github.com

3. StringJoiner 클래스(Java 8+)

StringJoiner 클래스는 문자열 결합을 위한 더욱 강력한 기능을 제공합니다. 연결 중에 구분 기호를 지정할 수 있을 뿐만 아니라 접두사와 접미사도 지정할 수 있습니다. 문자열을 연결할 때 add() 메소드를 사용할 수 있습니다 . 여기서는 null 값을 방지하기 위해 nullToString() 메서드도 사용됩니다 .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. 스트림 필터(Java 8+)

Stream API는 표준 필터링, 일치, 순회, 그룹화, 통계 및 기타 작업을 수행할 수 있는 Java 8에 도입된 강력한 스트림 작업 클래스입니다.
  • 필터 연산 필터는 Predicate 함수를 받을 수 있습니다 .
  • Predicate 함수 의 인터페이스는 앞서 소개한 Function 인터페이스 와 동일합니다 .
  • 이것은 기능적인 인터페이스입니다.
  • 일반 매개변수 <T> 를 사용할 수 있으며 반환 값은 부울 유형입니다.
  • 조건자는 종종 필터 데이터 에 사용됩니다 .
따라서 null 문자열을 확인 하고 이를 Stream API의 filter() 메서드 에 전달하는 조건자를 정의할 수 있습니다 . 또한 Collectors.joining() 메서드를 사용하여 null이 아닌 나머지 문자열을 조인할 수 있습니다.
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5. + 연산자를 사용하세요

+ 연산자를 사용하면 문제가 해결될 수도 있지만 권장되지는 않습니다. 우리는 String 이 불변 객체라는 것을 알고 있습니다. + 기호를 사용하면 문자열 개체가 생성되는 경우가 많고, 메모리에 새 문자열이 생성될 때마다 + 기호를 사용하여 문자열을 연결하는 경우 성능 소모가 매우 높습니다.

결론

이 문서에서는 문자열을 연결하고 NULL을 처리하는 여러 가지 방법을 제시합니다. 이 방법은 다양한 시나리오에 적합할 수 있습니다. 분석 결과 StringBuilder의 성능이 가장 좋은 것으로 나타났습니다. 하지만 실제 상황에서는 특정 시나리오를 결합한 다음 성능 손실이 가장 적은 방법을 선택해야 합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION