사용자 도구

사이트 도구


java:8:stream

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:8:stream [2015/11/17 12:34]
kwon37xi
java:8:stream [2020/08/09 16:06]
kwon37xi
줄 4: 줄 4:
   * [[http://www.javacodegeeks.com/2015/09/stream-performance.html|Stream Performance]]   * [[http://www.javacodegeeks.com/2015/09/stream-performance.html|Stream Performance]]
   * [[http://www.slideshare.net/ssuser1fb4cf/api-42194312|Java 8 Stream API]]   * [[http://www.slideshare.net/ssuser1fb4cf/api-42194312|Java 8 Stream API]]
 +
 +===== Stream for Iterable =====
 +  * [[http://stackoverflow.com/questions/23932061/convert-iterable-to-stream-using-java-8-jdk|Convert Iterable to Stream using Java 8 JDK]]<code java>
 +StreamSupport.stream(iterable.spliterator(), false)
 +             .filter(...)
 +             .moreStreamOps(...);
 +</code>
 +
 +===== List<List<Object>> 같은 컬렉션의 컬렉션 Flatten =====
 +  * [[http://stackoverflow.com/questions/25147094/turn-a-list-of-lists-into-a-list-using-lambdas|java - Turn a List of Lists into a List Using Lambdas - Stack Overflow]]
 +<code java>
 +List<List<Object>> list = ...
 +List<Object> flat = 
 +    list.stream()
 +        .flatMap(List::stream)
 +        .collect(Collectors.toList());
 +</code>
 +
 +===== Null safe stream =====
 +<code java>
 +public static <T> Stream<T> asStream(Collection<T> collection) {
 +    return Optional.ofNullable(collection)
 +        .map(Collection::stream)
 +        .orElse(Stream.empty());
 +}
 +
 +public static <T> Stream<T> asStream(T[] array) {
 +    return Optional.ofNullable(array)
 +        .map(Arrays::stream)
 +        .orElse(Stream.empty());
 +}
 +
 +public static <K, V> Stream<Map.Entry<K, V>> asStream(Map<K, V> map) {
 +    return Optional.ofNullable(map)
 +        .map(kvMap -> kvMap.entrySet().stream())
 +        .orElse(Stream.empty());
 +}
 +
 +</code>
 +
 +===== distinct by key =====
 +  * 객체의 특정 field / property 를 통해 ''distinct''를 하려면,
 +  * [[https://stackoverflow.com/a/27872852/1051402|별도 Predicate 선언방식]] <code java>
 +public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
 +    Map<Object,Boolean> seen = new ConcurrentHashMap<>(); // parallel stream에서 호출할까봐 이렇게 한듯.
 +    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
 +}
 +
 +persons.stream().filter(distinctByKey(p -> p.getName());
 +</code>
 +  * ''toMap''이용<code java>
 +// 특정 Key 필드로 Map을 만들되 중복 값은 모두 무시
 +persons.stream()
 +  .collect(toMap(Person::getName, Function.identity(), (p1, p2) -> p1))
 +  .values();
 +</code>
 +
 +===== parallelStream =====
 +  * [[https://dzone.com/articles/should-i-parallalise-streams|Should I Parallelize Java 8 Streams?]]
 +  * ``parallelStream``은 작업 분배 오버헤드가 발생하기 때문에 CPU 연산작업만 병렬화 할경우에는 오히려 느려지는 경향이 있다.
 +  * DB 조회/API 호출 처럼 순차보다는 병렬이 확실히 더 확실할 때 빼고는 ''parallelStream''은 사용하지 않는게 낫다.
 +  * 그리고 Thread 안정성도 보장해줘야한다.
 +  * 따라서 성능테스트로 완벽하게 더 좋은 성능이 보장되지 않는다면, 그냥 기본적으로 일반 스트림을 사용해야 한다.
 +
 +===== unmodifiable, immutable collection =====
 +  * [[https://medium.com/@hithacker/producing-immutable-list-from-stream-in-java-8-97f96ae3b04f|Producing immutable list from stream in Java 8 - Hiren Thacker - Medium]]
 +
 +<code java>
 +List<Shape> immutableBlues = shapes.stream()
 +                         .filter(s -> s.getColor() == BLUE)
 +                         .collect(collectingAndThen(toList(),
 +                                  Collections::unmodifiableList))
 +</code>
 +  * [[https://www.baeldung.com/java-stream-immutable-collection|Collect a Java Stream to an Immutable Collection]] [[java:guava|Guava]] 21 부터 Collector 가 추가됨.
 +
 +<code java>
 +    List<Integer> list = IntStream.range(0, 9)
 +      .boxed()
 +      .collect(ImmutableList.toImmutableList());
 +</code>
 +
 +<code java>
 +// Generic Immutable Collection collector 만들기. 컬렉션 구현체를 원하는대로 선택
 +public static <T, A extends List<T>> Collector<T, A, List<T>> toImmutableList(
 +  Supplier<A> supplier) {
 +  
 +    return Collector.of(
 +      supplier,
 +      List::add, (left, right) -> {
 +        left.addAll(right);
 +        return left;
 +      }, Collections::unmodifiableList);
 +}
 +
 +// 사용예 - LinkedList 구현을 unmodifiable로 감싸기
 +List<String> givenList = Arrays.asList("a", "b", "c", "d");
 +List<String> result = givenList.stream()
 +  .collect(MyImmutableListCollector.toImmutableList(LinkedList::new));
 +</code>
 +  * ''ImmutableMap.toImmutableMap()'' 도 사용가능. ''Collectors.toMap'' 과 유사
 +===== 참고 =====
 +  * [[https://www.baeldung.com/java-predicate-chain|Java 8 Predicate Chain | Baeldung]]
 +  * [[https://www.baeldung.com/java-stream-reduce|Guide to Stream.reduce() | Baeldung]]
 +
java/8/stream.txt · 마지막으로 수정됨: 2022/04/09 00:10 저자 kwon37xi