Integer 타입을 요소로 가지는 List를 입력받아 요소의 평균을 리턴해야합니다.
비어있는 List의 경우 0을 리턴해야 합니다.
public double computeAverageOfNumbers(List<Integer> list) {
// 방법-1
return list.isEmpty() ? 0 : list.stream().mapToInt(e->e).average().getAsDouble();
// 방법-2
return list.stream() // Stream<Integer>
.mapToDouble(d -> d) // DoubleStream
.average() // OptionalDouble
.orElse(0.0); // double
}
방법 1
은 삼항 연산자를 사용하여 isPresent()
을 처리했고, 방법 2
는 orElse()를 사용했다.
(isPresent()
: 값이 존재하는지 확인하는 메서드)
DoubleStream 인터페이스의 average()는 리턴값이 OptionalDouble이다.
OptionalDouble 객체의 값을 double로 가져오기 위해서는 getAsDouble()
를 사용해야 한다.
return list.stream().mapToInt(e->e).average().getAsDouble();
orElse()
는 Optional, OptionalDouble 등 여러 클래스에 존재한다.
OptionalDouble 클래스 내에 있는 orElse()를 보면, 다음과 같다.
public double orElse(double other) {
return isPresent ? value : other;
}
만약 값이 존재하면(isPresent()
), 해당 값을 리턴하고 값이 존재하지 않으면 정해둔 값(other)를 리턴한다.
방법 2
에서는 방법 1
과 다르게, getAsDouble() 메소드를 사용하지 않았는데, 이는 orElse의 리턴값이 double이기 때문이다.
https://codechacha.com/ko/java8-convert-stream-to-array/
Stream.toArray(Type[]::new)
String 타입을 요소로 가지는 배열을 입력받아, 가장 길이가 긴 문자열 요소의 길이를 리턴해야 합니다.
public int findLongestLength(String[] strArr){
// 방법 1
return Arrays.stream(strArr).mapToInt(String::length).max().getAsInt();
// 방법 2
return Arrays.stream(strArr).mapToInt(String::length).max().orElse(0);
}
public int findLongestLength(String[] strArr){
// 방법 3
String obj = Arrays.stream(strArr).max(Comparator.comparingInt(String::length)).get();
return obj.length();
}
방법 3
는 각 String 스트림마다 String::length로 값을 comparing해서 가장 값이 큰 객체를 return 받는다.
String 타입을 요소로 가지는 List 두 개를 입력받아, 스트림을 이용해 하나의 List로 합친 결과를 리턴해야 합니다.
public List<String> mergeTwoStream(List<String> list1, List<String> list2) {
return Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
}
public List<String> mergeTwoStream(List<String> list1, List<String> list2) {
return Stream.of(list1, list2) // Stream<List<String>>
.flatMap(Collection::stream) // Stream<String>
.collect(Collectors.toList());
}
// 출력
["김코딩", "박해커", "최자바", "이스프링"]
List<String> list1 = Arrays.asList("김코딩", "박해커");
List<String> list2 = Arrays.asList("최자바", "이스프링");
List<List<String>> s = Stream.of(list1, list2).collect(Collectors.toList());
System.out.println(s);
// 출력
[[김코딩, 박해커], [최자바, 이스프링]]
Stream.of(list1)
: list1을 Stream으로 만든다.Stream.of(list1, list2)
: list1과 list2를 merge한 Stream을 만든다.즉 Stream.of(list1, list2)
은 Stream<List<String>>
인 [김코딩, 박해커], [최자바, 이스프링] 스트림을 만든다.
flatMap(Collection::stream)
은 Stream<List<String>>
인 [김코딩, 박해커], [최자바, 이스프링] 스트림의 중첩을 하나 제거하여 Stream<String>
으로 만든다.
그리고 이런 Stream<String>
들을 collect()로 모아서 다시 배열로 만들어준다.
최종적으로 ["김코딩", "박해커", "최자바", "이스프링"] 이 출력된다.
https://mangkyu.tistory.com/115