[Java] 스트림 실습

박채은·2022년 11월 16일
0

Java

목록 보기
26/30

1) 평균 구하기

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() : 값이 존재하는지 확인하는 메서드)

OptionalDouble 클래스

공식 문서 - OptionalDouble

DoubleStream 인터페이스의 average()는 리턴값이 OptionalDouble이다.
OptionalDouble 객체의 값을 double로 가져오기 위해서는 getAsDouble()를 사용해야 한다.

return list.stream().mapToInt(e->e).average().getAsDouble();

orElse()

orElse()는 Optional, OptionalDouble 등 여러 클래스에 존재한다.

OptionalDouble 클래스 내에 있는 orElse()를 보면, 다음과 같다.

public double orElse(double other) {
        return isPresent ? value : other;
}

만약 값이 존재하면(isPresent()), 해당 값을 리턴하고 값이 존재하지 않으면 정해둔 값(other)를 리턴한다.

방법 2에서는 방법 1과 다르게, getAsDouble() 메소드를 사용하지 않았는데, 이는 orElse의 리턴값이 double이기 때문이다.


2) 스트림을 배열로 변환

https://codechacha.com/ko/java8-convert-stream-to-array/

  • 스트림을 Type 타입의 배열로 변환
Stream.toArray(Type[]::new)

3) 가장 긴 문자열의 길이 출력

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 받는다.

4) 두 스트림 merge하기

String 타입을 요소로 가지는 List 두 개를 입력받아, 스트림을 이용해 하나의 List로 합친 결과를 리턴해야 합니다.

4.1) concat() 사용

public List<String> mergeTwoStream(List<String> list1, List<String> list2) {
    return Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
}

4.2) Stream.of() + flatMap()

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());
}
// 출력
["김코딩", "박해커", "최자바", "이스프링"]

Stream.of()

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()

flatMap(Collection::stream)Stream<List<String>>인 [김코딩, 박해커], [최자바, 이스프링] 스트림의 중첩을 하나 제거하여 Stream<String>으로 만든다.

  • [김코딩, 박해커] -> 김코딩, 박해커
  • [최자바, 이스프링] -> 최자바, 이스프링

그리고 이런 Stream<String>들을 collect()로 모아서 다시 배열로 만들어준다.

최종적으로 ["김코딩", "박해커", "최자바", "이스프링"] 이 출력된다.

https://mangkyu.tistory.com/115


0개의 댓글