Collection의 경우 .stream() 을 사용해 스트림을 만들 수 있다.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream();
배열의 경우 Stream.of(), Arrays.stream() 을 사용해 스트림을 만들 수 있다.
Stream<String> stream = Stream.of("a", "b", "c");
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
return votes.stream()
.filter(Region -> Region.getUserDto().getUserId().equals(user.getUserId()) ||Region.getRegionRestriction().getDisplayValue().equals(region) || Region.getRegionRestriction().equals(RegionRestriction.All) )
.filter(Gender -> Gender.getUserDto().getUserId().equals(user.getUserId()) ||Gender.getGenderRestriction().getDisplayValue().equals(gender) || Gender.getGenderRestriction().equals(GenderRestriction.All))
.filter(Friends -> Friends.getUserDto().getUserId().equals(user.getUserId()) || Friends.getDisplayRange().equals(DisplayRange.PUBLIC) || followRepository.findByFromUserAndToUser(user, Friends.getUserDto().toEntity()) !=null && followRepository.findByFromUserAndToUser(user, Friends.getUserDto().toEntity()).isFriend() )
.filter(Age -> Age.getUserDto().getUserId().equals(user.getUserId()) || Age.getAgeRestriction().getDisplayValue().equals(age_range) || Age.getAgeRestriction().equals(AgeRestriction.All))
.collect(Collectors.toList());

return list.stream()
.distinct()
.기타 연산~



List<Vote> votes = voteRepository.findAll(); // 1차원 리스트
List<VoteDto> map = votes.stream() // .stream()을 통해 껍데기를 한번 벗기면 Vote가 나옴
.map(VoteDto::from) // 여기서 Vote -> VoteDto 로 변환
.peek(System.out::println)
.collect(Collectors.toList());
List<List<Vote>> votesList = Arrays.asList(votes); // 2차원 리스트
List<VoteDto> flatmap = votesList.stream() // .stream()을 통해 껍데기를 한번 벗기면 List<Vote>가 나옴
.flatMap(flat -> flat.stream()) // .flatMap()을 통해 List<Vote> -> Vote 로 변환
.map(VoteDto::from) // 여기서 Vote -> VoteDto 로 변환
.peek(System.out::println)
.collect(Collectors.toList());

Comparator 인자 없이 호출할 경우에는 오름차순으로 정렬이 되며
내림차순으로 정렬하기 위해서는 Comparator의 reverseOrder를 이용하면 됩니다.
List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f");
Stream<String> stream = list.stream().sorted()
// a, b, c, d, e, f
Stream<String> stream = list.stream()
.sorted(Comparator.reverseOrder())
// f, e, d, c, b, a
Stream<String> stream = Stream.of("a", "b", "c", "d");
stream.forEach(System.out::println);
IntStream range = IntStream.range(1, 11);
int result = range.reduce((x, y) -> x + y).getAsInt(); // 55 초기값이 없는 형태
int result = range.reduce(10,(x, y) -> x + y); // 65 초기값이 있는 형태
Stream에서 어떤 조건에 일치하는 요소(element) 1개를 찾을 때
findAny()와 findFirst() 를 사용할 수 있습니다.
IntStream stream1 = IntStream.rnage(1,10);
IntStream stream2 = IntStream.rnage(1,10);
OptionalInt result1 = stream1.sorted().findFirst();
System.out.println(result1.getAsInt()); // 직렬: return 1
OptionalInt result2 = stream2.sorted().findAny();
System.out.println(result2.getAsInt()); // 직렬: return 1
OptionalInt result1 = stream1.parallel().sorted().findFirst();
System.out.println(result1.getAsInt()); // 병렬: return 1
OptionalInt result2 = stream2.parallel().sorted().findAny();
System.out.println(result2.getAsInt()); // 병렬: return 5 (5가 될 수 있음)
Stream을 직렬로 처리할 때 findFirst()와 findAny()는 동일한 요소를 리턴하며, 차이점이 없습니다.
하지만 Stream을 병렬로 처리할 때는 차이가 있습니다.
findFirst()는 Stream의 순서를 고려하여 가장 앞에 있는 요소를 리턴합니다.
반면에 findAny()는 Multi thread에서 Stream을 처리할 때 가장 먼저 찾은 요소를 리턴합니다.
따라서 Stream의 뒤쪽에 있는 element가 리턴될 수 있습니다.
anyMatch() : 해당 스트림의 일부 요소가 특정 조건을 만족할 경우에 true를 반환함.
allMatch() : 해당 스트림의 모든 요소가 특정 조건을 만족할 경우에 true를 반환함.
noneMatch() : 해당 스트림의 모든 요소가 특정 조건을 만족하지 않을 경우에 true를 반환함.
모두 파라미터로 함수형 인터페이스 Predicate를 인자로 받습니다.
IntStream stream1 = IntStream.of(30, 90, 70, 10);
IntStream stream2 = IntStream.of(30, 90, 70, 10);
IntStream stream3 = IntStream.of(30, 90, 70, 10);
System.out.println(stream1.anyMatch(n -> n > 80)); // true
System.out.println(stream2.allMatch(n -> n > 80)); // false
System.out.println(stream3.noneMatch(n -> n > 80)); // false
IntStream stream1 = IntStream.of(30, 90, 70, 10);
IntStream stream2 = IntStream.of(30, 90, 70, 10);
IntStream stream3 = IntStream.of(30, 90, 70, 10);
IntStream stream4 = IntStream.of(30, 90, 70, 10);
DoubleStream stream5 = DoubleStream.of(30.3, 90.9, 70.7, 10.1);
System.out.println(stream1.count()); // 4
System.out.println(stream2.max().getAsInt()); // 90
System.out.println(stream3.min().getAsInt()); // 90
System.out.println(stream4.sum()); // 200
System.out.println(stream5.average().getAsDouble()); // 50.5
스트림을 배열이나 컬렉션으로 변환 : toArray(), toCollection(), toList(), toSet(), toMap()
요소의 통계 및 연산 메소드와 같은 동작을 수행 : counting(), maxBy(), minBy(), summingInt(), averagingInt(), summarizingInt()
요소의 소모와 같은 동작을 수행 : reducing(), joining()
요소의 그룹화와 분할 : groupingBy(), partitioningBy()
모두 collect( Collectors.메서드이름() ) 형태로 사용합니다.
이번 스트림 시리즈를 통해 스트림을 좀더 알아볼 수 있었습니다.
완벽히 안다고 할 수 없지만 앞으로 간결하고 가독성 좋은 코드를 짤때 조금이나마 도움이 되지 않을까요??
일단은 제가 나중에 보려고 쓴 글이지만 누군가 보고 도움이 됐으면 좋겠습니다