Stream 의 일반적인 동작 들
8047 단어 자바 8 문법
어떻게 Stream 을 이해 합 니까?내 가 보기에 Stream 은 집합 요소 가 아니 라 데이터 구조 가 데 이 터 를 저장 하지 않 는 것 이 아니 라 알고리즘 과 계산 에 관 한 것 이 며 고급 버 전의 Iterator 와 같다.쉽게 말 하면 그 역할 은 일련의 조작 을 통 해 데이터 소스 (집합, 배열) 를 원 하 는 결과 로 바 꾸 는 것 이다.
Stream 은 세 가지 중요 한 특성 이 있 습 니 다.
스 트림 생 성
//Collection stream() parallelStream()
List list = new ArrayList<> ();
Stream stream = list.stream();
Stream stringStream = list.parallelStream();
// Arrays.stram()
Stream stream1 = Arrays.stream(new String[10]);
// Stream.of()
Stream stream2 = Stream.of(1, 2, 3,4,5,6,7,8,9,10);
// Stream.iterate()
Stream iterate = Stream.iterate(0, (x) -> x + 2);
iterate.limit(10).forEach(System.out::println);
// Stream.generate()
Stream generate = Stream.generate(() -> Math.random());
스 트림 중간 조작
stream2.map(s -> s + 1) //
.flatMap(s -> Stream.of(s)) // map , Stream, list.add() list.addAll()
.filter(s -> s <=5 ) //
.limit(5) //
.skip(1) //
.distinct() //
.sorted() //
.sorted(Integer::compareTo).forEach (System.out::println); // */
Stream 의 종료 동작 (같은 흐름 을 한 번 에 실행 할 수 없습니다. 한 번 에 작업 을 종료 합 니 다)
자주 사용 하 는 종료 API 는 다음 과 같 습 니 다.
System.out.println (stream2.allMatch((x) -> x == 10)); // boolean
System.out.println(stream2.anyMatch(((x) -> x>5))); //
System.out.println(stream2.noneMatch((x) -> x>500)); //
System.out.println (stream2.findFirst()); // Optional[1]
System.out.println (stream2.findAny()); // ;
System.out.println (stream2.count()); // );
Optional max = stream2.max(Integer::compareTo); //
System.out.println("max "+max.get());
Optional min = stream2.min(Integer::compareTo);//
System.out.println("min "+min.get());
reduce (귀 약): 흐름 속 요 소 를 반복 적 으로 결합 하여 값 을 얻 습 니 다.
Integer reduce = stream2.map(s -> (s + 1)).reduce(0, (integer1, integer2) -> integer1+integer2);
// :0 x ,x ,y 。
System.out.println(reduce);
Optional reduce1 = stream2.map(s -> (s + 1)).reduce((x, y) -> x + y);
// x , ,y 。
System.out.println(reduce1.get ());
collect (수집): 흐름 을 다른 형식 으로 변환 합 니 다.Collectors 클래스 의 방법 이 필요 합 니 다.
//collect( ): 。 Collectors 。
Set collect = stream2.collect(Collectors.toSet());
List collect2 = stream2.collect(Collectors.toList());
HashSet collect1 = stream2.collect(Collectors.toCollection(HashSet::new));
// {group=[1, 2, 3, 4...]}
Map> collect3 = stream2.collect(Collectors.groupingBy((x) -> "group"));//
// {false=[1, 2, 3, 4], true=[5, 6, 7, 8, 9, 10, 10]}
Map> collect5 = stream2.collect(Collectors.partitioningBy((x) -> x >= 5));
// 、 、 、
DoubleSummaryStatistics collect6 = stream2.collect(Collectors.summarizingDouble((x) -> x));
System.out.println(collect6.getMax());
System.out.println(collect6.getCount());
발췌: https://mp.weixin.qq.com/s/5UUD7N4Uxspnzcine_2AnA
작업 상용 예시
package JDK8 ;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Heian
* @time 19/04/01 14:15
* :
*/
public class Demo1 {
class Student{
private int id;
private String name;
private int age;
public Student(int id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) {
Demo1 demo1 = new Demo1 ();
List list = new ArrayList<> ();
list.add (demo1.new Student (1," ",18));
list.add (demo1.new Student (2," ",20));
list.add (demo1.new Student (3," ",22));
list.add (demo1.new Student (4," ",19));
list.add (demo1.new Student (5," ",17));
list.add (null);
// :
//Optional.ofNullable (list).orElse (Collections.emptyList ()).forEach (System.out::println); null
list.stream ().filter (Objects::nonNull).forEach (student -> System.out.println (student));
// : ( )
System.out.println ("======================= ===================");
List nameList = list.stream ().filter (Objects::nonNull).map (Student::getName).collect(Collectors.toList());
nameList.forEach (System.out::println);// --->filter --->map ( Stream)--->
//limit mysql limit num 3
List nameList2 = list.stream ().filter (Objects::nonNull).map (Student::getName).limit (3).collect(Collectors.toList());
nameList2.forEach (s -> System.out.println ("limit" + s));
// skip mysql 1 10 select * from emp limit 0,9 : 2 4
List nameList3 = list.stream ().filter (Objects::nonNull).map (Student::getName).skip (1).limit (3).collect(Collectors.toList());
nameList3.forEach (s -> System.out.println ("skip limit" + s));
List list2 = Arrays.asList(1,2,3);
//
list2.forEach(i -> i = i*2);
list2.forEach(integer -> System.out.println (" "+integer));
//
list2.stream().map(i -> i * 2).forEach(integer -> System.out.println (" "+integer));
// :list map
System.out.println ("=======================list map ===================");
Map map = list.stream ().filter (Objects::nonNull).collect (Collectors.toMap (Student::getId,student -> student));
for (Map.Entry entrySet: map.entrySet ()){
System.out.println (entrySet.getKey () +":"+ entrySet.getValue ());
}
System.out.println ("======================= ===================");
// :
// 1: Comparable String Integer ,
List notNullList = list.stream ().filter (Objects::nonNull).collect (Collectors.toList ());
Collections.sort (notNullList,(o1, o2) -> {
return Integer.compare (o1.age,o2.age);
});
// Comparator
Collections.sort (notNullList,Comparator.comparing (o -> o.age));
notNullList.forEach (student -> System.out.println (student));
// , 1234...9
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream().forEach(System.out::println);
numbers.parallelStream ().forEachOrdered (System.out::println);//
}
}