public class ElementPrint {
public static void main(String[] args) {
Stream<String> strStream = Stream.of("넷","둘","셋","하나");
strStream.forEach(System.out::println);
}
}
넷
둘
셋
하나
public class ElementConsume {
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("넷", "둘", "하나", "셋");
Stream<String> stream2 = Stream.of("넷", "둘", "하나", "셋");
Optional<String> result1 = stream1.reduce((s1,s2)-> s1 +"++"+s2);
result1.ifPresent(System.out::println);
System.out.println();
String result2 = stream2.reduce("시작",(s1,s2)-> s1+"--"+s2);
System.out.println("result2 = " + result2);
}
}
넷++둘++하나++셋
result2 = 시작--넷--둘--하나--셋
: result1이 Optional 을 반환하는 이유는 결과가 null일 가능성이 있기 때문
: result2가 String으로 바로 반환이 가능한 이유는 "초깃값"이 있기 때문
public class ElementSearch {
public static void main(String[] args) {
IntStream stream1 = IntStream.of(4,2,7,1,3,6);
IntStream stream2 = IntStream.of(4,2,7,1,3,6);
OptionalInt result1 = stream1.sorted().findFirst();
System.out.println("result1 = " + result1.getAsInt());
OptionalInt result2 = stream2.sorted().findAny();
System.out.println("result2 = " + result2.getAsInt());
}
}
result1 = 1
result2 = 1
: 두 메서드(findAny()
, findFirst()
) 모두 동일한 결과를 출력
: 병렬 스트림에서는 예외! → findAny()
를 사용해야만 정확한 연산 결과를 반환
public class ElementMatch {
public static void main(String[] args) {
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));
System.out.println(stream2.allMatch(n -> n> 80));
System.out.println(stream3.noneMatch(n -> n > 100));
}
}
true
false
true
public class ElementStatics {
public static void main(String[] args) {
IntStream stream1 = IntStream.of(30,70,90,10);
IntStream stream2 = IntStream.of(30,70,90,10);
Stream<String> stream3 = Stream.of("3000","700","90","10");
System.out.println(stream1.count());
OptionalInt result2= stream2.min();
System.out.println(result2.getAsInt());
System.out.println(stream3.min(Comparator.comparing(e-> e.length())).get());
}
}
4
10
90
: stream3의 경우 문자열이기 때문에, Comparator(비교객체)를 활용해야 연산이 가능하다
public class ElementOperation {
public static void main(String[] args) {
IntStream stream1 = IntStream.of(30,90,70,10);
DoubleStream stream2 = DoubleStream.of(30.3, 90.9, 70.7, 10.1);
System.out.println(stream1.sum());
System.out.println(stream2.average().getAsDouble());// average() -> OptionalDouble
}
}
200
50.5
collect()
: 인수로 전달되는 Collectors
객체에 구현된 방식대로 요소를 수집Collectors
메서드를 더 유의있게 봐야한다toArray(), toCollection(), toList(), toMap()
counting(), maxBy(), minBy(), summingInt(), averagingInt() ...
reducing(), joining()
groupingBy(), partitioningBy()
→ 정확한 활용법을 알도록!public class ElementCollect {
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("넷","둘","하나", "셋");
List<String> list = stream1.collect(Collectors.toList());
for( String e : list){
System.out.print(e + " ");
}
System.out.println();
List<Memebers> members = new ArrayList<>();
members.add(new Memebers(1, "jjm", "01011112222"));
members.add(new Memebers(2, "aaa", "01011112222"));
members.add(new Memebers(3, "bbb", "01011112222"));
Map<Boolean, List<Memebers>> resultMap1 = members.stream().collect(Collectors.partitioningBy(e->e.getId()>1));
resultMap1.get(true).forEach(e-> System.out.println(e.getName()));
Map<String, List<Memebers>> resultMap2= members.stream().collect(
Collectors.groupingBy(Memebers::getPhone)
);
resultMap2.get("01011112222").forEach(e-> System.out.println(e));
}
}
// 여기 밑은 재료
class Memebers implements Serializable {
private long id;
private String name;
private String phone;
public Memebers(long id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Memebers{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
넷 둘 하나 셋
aaa
bbb
Memebers{id=1, name='jjm', phone='01011112222'}
Memebers{id=2, name='aaa', phone='01011112222'}
Memebers{id=3, name='bbb', phone='01011112222'}
: partitioningBy()나 groupingBy()를 활용하게 되면, 요소 별 특징을 가지고 그룹화를 하거나, 분할을 할 수 있다
→ 다만 핸들링하기 쉽지 않으므로, Collectors와 Fnctional 인터페이스에 대해 더 공부하고 사용할 것을 추천!