Stream 의 일반적인 동작 들

8047 단어 자바 8 문법
최근 직장 을 옮 겼 기 때문에 프로젝트 에 서 는 jdk 1.8 을 사용 하기 때문에 jdk 1.8 소 작업 을 배 울 필요 가 있 습 니 다. 이 글 은 계속 업데이트 되 고 있 습 니 다.
    어떻게 Stream 을 이해 합 니까?내 가 보기에 Stream 은 집합 요소 가 아니 라 데이터 구조 가 데 이 터 를 저장 하지 않 는 것 이 아니 라 알고리즘 과 계산 에 관 한 것 이 며 고급 버 전의 Iterator 와 같다.쉽게 말 하면 그 역할 은 일련의 조작 을 통 해 데이터 소스 (집합, 배열) 를 원 하 는 결과 로 바 꾸 는 것 이다.
Stream 은 세 가지 중요 한 특성 이 있 습 니 다.
  • Stream 은 요 소 를 저장 하지 않 습 니 다.
  • Stream 은 원래 의 대상 을 바 꾸 지 않 고 반대로 결 과 를 가 진 새로운 Stream 으로 돌아간다.
  • 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);//    
        }
    
    }
    

    좋은 웹페이지 즐겨찾기