함수 식 인터페이스 와 Stream 흐름 의 완벽 한 조합

1.함수 식 인터페이스
함수 식 인터페이스:추상 적 인 방법 만 있 는 인터페이스
1.2 함수 식 인 터 페 이 스 를 방법의 매개 변수 로 한다.
/*
     (RunnableDemo),         
	     :startThread(Runnable r)     Runnable        
	        ,       startThread  
*/

public class RunnableDemo {
    public static void main(String[] args) {
        //     
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"   ");
            }
        });
        
        //Lambda   
        startThread(()->System.out.println(Thread.currentThread().getName()+"   "));
       
    }

    private static void startThread(Runnable r){
        //Thread t = new Thread(r,"stratThread");
        //t.start();
        new Thread(r,"stratThread").start();
    }
}
    :stratThread   

만약 방법의 매개 변수 가 함수 식 인터페이스 라면,우 리 는 Lambda 표현 식 을 매개 변수 로 전달 할 수 있 습 니 다.
  • startThread()->System.out.println(Thread.currentThread().getName()+"시작 되 었 습 니 다");

  • 1.3 함수 식 인 터 페 이 스 를 방법 으로 되 돌려 줍 니 다.
    /*
             (ComparatorDemo),         
                 :Comparator getComparator()         Comparator        
                    :       getComparator()  
    
          :        ,       
     */
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    
    public class ComparatorDemo {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("aaaa");
            list.add("bbb");
            list.add("sss");
            list.add("c");
            list.add("cddf");
    
            System.out.println(list); //   
            Collections.sort(list,getComparator());//          ,         
            System.out.println(list); //   
        }
    
        //               ,            
        private static Comparator<String> getComparator() {
            //           Comparator  
            /*Comparator c = new Comparator() {
                @Override
                public int compare(String s1, String s2) {
                    return s1.length() - s2.length();
                }
            };
            return c;*/
            
           /* return new Comparator() {
                @Override
                public int compare(String s1, String s2) {
                    return s1.length() - s2.length();
                }
            };*/
            //Lambda   
            return (s1, s2) -> s1.length() - s2.length();
        }
    }
    

    1.4 상용 함수 식 인터페이스
    1.4.1 Supplier 인터페이스
    Supplier 인 터 페 이 스 는 주로 데 이 터 를 생산 하 는 데 사용 되 며,인삼 이 없 는 방법 을 포함한다.
  • T get():결과 획득
  • 이 방법 은 매개 변수 가 필요 하지 않 습 니 다.특정한 실현 논리(Lambda 표현 식 이 있 음)에 따라 데 이 터 를 되 돌려 줍 니 다.
  • Supplier 인터페이스 도 생산 형 인터페이스 라 고 불 린 다.만약 에 우리 가 인터페이스의 일반적인 유형 을 지정 하면 인터페이스의 get 방법 은 어떤 유형의 데 이 터 를 우리 에 게 되 돌려 줄 것 인가?
  • import java.util.Arrays;
    import java.util.function.Supplier;
    
    public class SupplierDemo {
        public static void main(String[] args) {
            Integer[] arr = {12,43,22,67,34,99};
    
            //       
            /*Integer max = getMax(new Supplier() {
                @Override
                public Integer get() {
                    Arrays.sort(arr);
                    return arr[arr.length - 1];
                }
            });
            */
            //Lambda   
            Integer max = getMax(()->{
                Arrays.sort(arr);
                return arr[arr.length - 1];
            });
            System.out.println(max);
        }
    
        //  Supplier      ,         
        private static Integer getMax(Supplier<Integer> s){
            return s.get();
        }
    }99
    

    1.4.2 소비자 인터페이스
    Consumer:두 가지 방법 포함
  • void accept(T t):주어진 매개 변수 에 대해 이 동작 을 수행 합 니 다
  • default Consumer and Then(Consumer after):한 그룹의 Consumer 를 되 돌려 이 동작 을 순서대로 실행 한 다음 after 동작 을 실행 합 니 다
  • Consumer 인터페이스 도 소비 형 인터페이스 라 고 불 리 며 소비 하 는 데이터 의 데이터 유형 은 범 형 으로 지정 된다
  • .
    accept 사용 하기(T t)
    public class ConsumerDemo {
        public static void main(String[] args) {
            String[] strings = {"  ,19","  ,22","  ,21","  ,19"};
    
            //       
            /*useString(strings, new Consumer() {
                @Override
                public void accept(String s) {
                    String[] split = s.split(",");
                    System.out.println("  ;"+split[0]+",  :"+split[1]);
                }
            });*/
    
            //Lambda   
            useString(strings,s-> System.out.println("  ;"+s.split(",")[0]+",  :"+s.split(",")[1]));
            
        }
        /**
         * @param strarr
         * @param con
         */
        private static void useString(String[] strarr, Consumer<String> con){
            //        ,    
            for (String s : strarr) {
                con.accept(s);// String[] strarr          ,    
            }
        }
    }
        :  ;  ,19,22,21,19
    

    Consumer and Then 사용 하기(Consumer after)
    public class ConsumerDemo {
        public static void main(String[] args) {
            String[] strings = {"  ,19","  ,22","  ,21","  ,19"};
            //    Consumer       
            //     
           /* useString2(strings, new Consumer() {
                @Override
                public void accept(String s) {
                    System.out.print("  ;"+s.split(",")[0]);
                }
            }, new Consumer() {
                @Override
                public void accept(String s) {
                    System.out.println(",  :"+s.split(",")[1]);
                }
            });
    */
            //Lambda   
            useString2(strings,
                       s ->System.out.print("  ;"+s.split(",")[0]),
                       s -> System.out.println(",  :"+s.split(",")[1])
                      );
        }
    
        /**
         * @param strarr
         * @param con1
         * @param con2
         *    andThen     Consumer             ,       
         */
        private static void useString2(String[] strarr,Consumer<String> con1,Consumer<String> con2){
            for (String s : strarr) {
                con1.andThen(con2).accept(s);//    Consumer      s    
            }
        }
    }
    
    

    1.4.3 Predicate 인터페이스
    Predicate 인 터 페 이 스 는 매개 변수 가 지정 한 조건 에 만족 하 는 지 판단 하 는 데 사 용 됩 니 다.
    Predicate:자주 사용 하 는 네 가지 방법
  • booleantest(T t):주어진 매개 변 수 를 판단 합 니 다(판단 논 리 는 Lambda 표현 식 으로 이 루어 집 니 다).불 값
  • 을 되 돌려 줍 니 다.
  • default Predicate negate():논리 적 부정 을 되 돌려 주 고 논리 적 비
  • 에 대응 합 니 다.
  • default Predicate and(Predicate other):한 그룹의 판단 을 되 돌려 주 고 단락 과 대응 합 니 다
  • default Predicate or(Predicate other):한 그룹의 판단 을 되 돌려 주 고 단락 또는
  • ① test,negate 방법 사용
    public class Demo {
        public static void main(String[] args) {
    
          /*  boolean result = usePredicate("hello", new Predicate() {
                @Override
                public boolean test(String s) {
                    return s.length()>8;
                }
            });*/
    
            boolean b1 = usePredicate("hello", s -> s.length()>8);
            System.out.println(b1);
    
            boolean b2 = usePredicate("hellowrold", s -> s.length() < 15);
            System.out.println(b2);
        }
        //
    
        //           
        private static boolean usePredicate(String str,Predicate<String> p){
    //        boolean test = p.test(str);
    //        return p.test(str);
            return p.negate().test(str);
        }
    }true
        	 false
    

    ② and(Predicate other),or(Predicate other)방법 사용
    public class Demo2 {
        public static void main(String[] args) {
    
            boolean b = checkString("hello", s -> s .length() > 8, s -> s.length() < 15);
            System.out.println(b);
        }
    
        //                 ,                       
        private static boolean checkString(String s, Predicate<String> p1, Predicate<String> p2) {
    //        boolean b1 = p1.test(s);
    //        boolean b2 = p2.test(s);
    //        return b1&&b2;
            //  and、or  
    //        return p1.and(p2).test(s);
            return p1.or(p2).test(s);
        }
    }true
    

    연습 하 다.
  • String[]strArr={"임 청 하,30","류 암,43","장만 옥,35","초선,28","왕조 현,33"};
  • 문자열 배열 에 여러 가지 정보 가 있 습 니 다.Predicate 인터페이스의 조합 을 통 해 조건 에 맞 는 문자열 을 집합 Array List 에 선별 하고 집합
  • 을 옮 겨 다 니 십시오.
  • 다음 과 같은 요 구 를 동시에 만족시킨다.성명 의 길 이 는 2 보다 크 고 나 이 는 33
  • 보다 크다.
    public class PredicateDemo1 {
        public static void main(String[] args) {
            String[] strArr = {"   ,30", "  ,43", "   ,35", "  ,28", "   ,33"};
    
            //  usePredicate  
            //     
           /* usePredicate(strArr, new Predicate() {
                @Override
                public boolean test(String s) {//          3
                    return s.split(",")[0].length() > 3;
                }
            }, new Predicate() {
                @Override
                public boolean test(String s) {//        33
                    return Integer.parseInt(s.split(",")[1]) > 33;
                }
            });*/
    
            //Lambda   
            usePredicate(strArr, 
                         s -> s.split(",")[0].length() > 2, //        2 
                         s -> Integer.parseInt(s.split(",")[1]) > 33 //      33 
                        );
    
        }
    
        private static void usePredicate(String[] strings, Predicate<String> pre1, Predicate<String> pre2) {
            //            
            ArrayList<String> list = new ArrayList<>();
    
            //       
            for (String string : strings) {
                boolean test = pre1.and(pre2).test(string);	//        
                if (test) {//  test true,   strings  list 
                    list.add(string);
                }
            }
    
            //  ArrayList
            for (String s : list) {
                System.out.println(s);
            }
        }
    },35
    

    1.4.4 함수 인터페이스
    Function 인 터 페 이 스 는 보통 매개 변 수 를 처리 하고 변환(처리 논 리 는 Lambda 표현 식 으로 이 루어 집 니 다)한 다음 에 새로운 값 이 자주 사용 하 는 두 가지 방법 을 되 돌려 줍 니 다.
  • R apply(T t):이 함 수 를 주어진 인자 에 적용 하기
  • default Function and Then(Function after):조합 함 수 를 되 돌려 줍 니 다.먼저 이 함 수 를 입력 에 적용 한 다음 after 함 수 를 결과 에 적용 합 니 다
  • public class Demo2 {
        public static void main(String[] args) {
            //      ,         int ,  
    //        convert("100",s->Integer.parseInt(s));
    
            //      ,   int              ,  
    //        convert(12,integer -> String.valueOf(integer+21));
    
            //      ,         int , int           ,       
            convert("12", s -> Integer.parseInt(s), i -> String.valueOf(i + 21));
        }
    
        //      ,         int , int           ,       
        private static void convert(String s, Function<String, Integer> f1, Function<Integer, String> f2) {
    //        Integer i = f1.apply(s);
    //        String ss = f2.apply(i);
    //        System.out.println(ss);
            String apply = f1.andThen(f2).apply(s);
            System.out.println(apply);
        }
    
        //      ,   int              ,  
        private static void convert(Integer i, Function<Integer, String> f) {
            String result = f.apply(i);
            System.out.println(result);
        }
    
        //      ,         int ,  
        private static void convert(String s, Function<String, Integer> f) {
            Integer result = f.apply(s);
            System.out.println(result);
        }
    }
    
    
    

    2.Stream 흐름
    2.1 Stream 흐름 의 생 성 방법
  • Collection 시스템 의 집합 은 기본 방법 stream()을 사용 하여 스 트림 default Stream stream()
  • 을 생 성 할 수 있 습 니 다.
  • Map 체계의 집합 간접 적 으로 흐름 생 성
  • 배열 은 Stream 인터페이스의 정적 방법 of(T..values)를 통 해 흐름 을 생 성 할 수 있 습 니 다
  • public class Demo2 {
        public static void main(String[] args) {
            //Collection          stream()   
            List<String> list = new ArrayList<>();
            Stream<String> listStream = list.stream();
    
            Set<String> set = new HashSet<String>();
            Stream<String> setStream = set.stream();
    
            //Map           
            Map<String,Integer> map = new HashMap<>();
            Stream<String> keyStream = map.keySet().stream();
            Stream<Integer> vlaueStream = map.values().stream();
    
            Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
    
            //      Stream       of(T...values)   
            String[] strArray = {"hello","world","java"};
            Stream<String> strArray1 = Stream.of(strArray);
            Stream<String> strArray2 = Stream.of("hello", "world", "java");
    
    
        }
    }
    
    
    

    2.2 Stream 흐름 에서 흔히 볼 수 있 는 중간 조작 방법
    2.1.1 filter(Predicate p)
    Stream filter(Predicate predicate):흐 르 는 데 이 터 를 걸 러 내 는 데 사용 합 니 다.
    Predicate 인터페이스 에서 의 방법 Boolean test(T t):주어진 매개 변 수 를 판단 하여 불 값 을 되 돌려 줍 니 다.
    public class Demo1 {
        public static void main(String[] args) {
            ArrayList<String> names = new ArrayList<>();
            names.add("  ");
            names.add("   ");
            names.add("   ");
            names.add("   ");
            names.add("   ");
            names.add("  ");
    		//      
            ArrayList<String> zhangs = new ArrayList<>();
            for (String name : names) {
                if(name.startsWith(" ")){
                    zhangs.add(name);
                }
            }
    		//                3 
            ArrayList<String> three = new ArrayList<>();
            for (String zhang : zhangs) {
                if(zhang.length()==3){
                    three.add(zhang);
                }
            }
    		//      
            for (String s : three) {
                System.out.println(s);
            }
    
            System.out.println("----------");
            //  stream   
            names.stream().filter(s->s.startsWith(" ")).filter(s->s.length()==3).forEach(System.out::println);
            /**
             * names.stream():   stream   
             * filter(s->s.startsWith(" ")):    “ ”      
             * filter(s->s.length()==3):          ,             
             * forEach(System.out::println):            
             */
    
        }
    }
    
    
    

    2.1.2 limit(long n)
    Stream limit(long n):캡 처 한 n 개의 요소 로 구 성 된 흐름 을 되 돌려 줍 니 다.
    2.1.3 skip(long n)
    Stream skip(long n):지정 한 매개 변수 개수 의 요 소 를 건 너 뛰 고 나머지 요소 로 구 성 된 흐름 을 되 돌려 줍 니 다.
    public class Demo3 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
    
            //   4   
            list.stream().limit(4).forEach(System.out::println);
    
            System.out.println("----------");
            //   2 ,     
            list.stream().skip(2).forEach(System.out::println);
    
            System.out.println("----------");
            //   2 ,         2 
            list.stream().skip(2).limit(2).forEach(System.out::println);
        }
    }----------
                  
                  
                  
                  
                ----------
                  
                  
    
    

    2.1.4 concat(Stream a, Stream b)
    Static Stream concat(Stream a,Stream b):a 와 b 두 개의 흐름 을 합 쳐 하나의 흐름 으로 합 칩 니 다.
    2.1.5 distinct()
    Stream distinct():이 흐름 의 다른 요소(Object.equals(Object o)로 구 성 된 흐름 을 되 돌려 줍 니 다.
    public class Demo4 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
            list.add("  ");
    
            //  1:   4        
            Stream<String> stream1 = list.stream().limit(4);
    
            //  2:   2 ,        
            Stream<String> stream2 = list.stream().skip(2);
    
            //  3:             ,   
    //        Stream.concat(stream1, stream2).forEach(System.out::println);
    
            //  4:    1   2  ,         
            Stream.concat(stream1, stream2).distinct().forEach(System.out::println);
    
        }
    }
    
    

    2.1.6 sorted()
    Stream sorted():이 흐름 의 요소 로 구 성 된 흐름 을 되 돌려 주 고 자 연 스 럽 게 정렬 합 니 다.
    Stream sorted(Comparator comparator):이 흐름 의 요소 로 구 성 된 흐름 을 되 돌려 주 고 제 공 된 Comparator 에 따라 정렬 합 니 다.
    public class Demo5 {
        public static void main(String[] args) {
            ArrayList<String> list  = new ArrayList<>();
            list.add("aas");
            list.add("acbds");
            list.add("sccd");
            list.add("cbffe");
            list.add("scce");
    
            //  1:        
    //        list.stream().sorted().forEach(System.out::println);
    
            //  2:         
    //        list.stream().sorted((s1, s2) -> s1.length()-s2.length()).forEach(System.out::println);
    
            //  3:      ,      ,       
            list.stream().sorted((s1,s2)->{
                int num = s1.length()-s2.length();
                return num==0?s1.compareTo(s2):num;
            }).forEach(System.out::println);
        }
    }
        :	 aas
                sccd
                scce
                acbds
                cbffe
    
    

    2.1.7 map(Function m)
    Stream map(Function m):주어진 함수 가 이 흐름 에 적용 한 요소 의 결과 로 구 성 된 흐름 을 되 돌려 줍 니 다.
  • Function 인터페이스 에서 의 방법 apply(T t)
  • 2.1.8 mapToInt(ToIntFunction m)
    IntStream mapToInt(ToIntFunction m):주어진 함 수 를 이 흐름 에 적용 하 는 요 소 를 포함 하 는 IntStream 을 되 돌려 줍 니 다.
    인 트 스 트림 인터페이스
  • int sum()은 이 흐름 에서 요소 의 합 계 를 되 돌려 줍 니 다.
  • public class Demo6 {
        public static void main(String[] args) {
            //      
            ArrayList<String> list = new ArrayList<>();
            list.add("2");
            list.add("3");
            list.add("4");
            list.add("5");
            list.add("6");
            list.add("7");
    
            //  1:               
    //        list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
    //        list.stream().map(Integer::parseInt).forEach(System.out::println);
    
            //int sum()           。
            int sum = list.stream().mapToInt(Integer::parseInt).sum();
            System.out.println(sum);
            //list.stream()    stream 
            //mapToInt(Integer::parseInt)     IntStream 
            //sum()  IntStream        ,      
        }
    }
    
    
    

    2.3 Stream 흐름 의 흔 한 종료 동작
  • void foreach(Consumer action):요 소 를 옮 겨 다 니 며 해당 동작 을 수행 합 니 다.Consumer 인터페이스 에서 의 방법 void accept(T t):주어진 매개 변수 에 대해 작업 을 수행 합 니 다
  • long count():이 흐름 의 요소 개 수 를 되 돌려 줍 니 다
  • public class Demo7 {
        public static void main(String[] args) {
            ArrayList<String > list = new ArrayList<>();
            list.add("   ");
            list.add("   ");
            list.add("   ");
            list.add("  ");
            list.add("   ");
    
            //  1:         
    //        list.stream().forEach(System.out::println);
    
            //  2:        “ ”     ,            
            long count = list.stream().filter(s -> s.startsWith(" ")).count();
            System.out.println(count);
        }
    }3
    
    

    종합 연습
    /*
            ArrayList  ,    6            ,        :
                           
                           
                                 
                                     ,    
                   Actor    ,         ,      ,  get、set  
     */
    
    import java.util.ArrayList;
    import java.util.stream.Stream;
    
    class Actor {
        private String name;
        public String getName() {
            return name;
        }
    
        @Override
        public String toString() {
            return "Actor{" +
                    "name='" + name + '\'' +
                    '}';
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Actor(String name) {
            this.name = name;
        }
    }
    
    public class Test_02 {
        public static void main(String[] args) {
            ArrayList<String> maleList = new ArrayList<>();
            ArrayList<String> femaleList = new ArrayList<>();
    
            maleList.add("   ");
            maleList.add("   ");
            maleList.add("   ");
            maleList.add("  ");
            maleList.add("  ");
            maleList.add("   ");
    
            femaleList.add("   ");
            femaleList.add("   ");
            femaleList.add("   ");
            femaleList.add("  ");
            femaleList.add("  ");
            femaleList.add("   ");
    
            //               
            Stream<String> manStream = maleList.stream().filter(s -> s.length() == 3).limit(3);
            
            //               
            Stream<String> womanStream = femaleList.stream().filter(s -> s.startsWith(" ")).skip(1);
    
            //                     
            Stream<String> concatStream = Stream.concat(manStream, womanStream);
    
            //                         ,    
            concatStream.map(s->new Actor(s)).forEach(System.out::println);
    //        concatStream.map(Actor::new).forEach(a-> System.out.println(a.getName()));
        }
    }
        :	 Actor{name='   '}
                Actor{name='   '}
                Actor{name='   '}
                Actor{name='   '}
                Actor{name='   '}
    
    

    2.4 Stream 흐름 의 수집 작업
    데이터 에 대해 Stream 흐름 을 사용 하 는 방식 으로 조작 이 끝 난 후에 저 는 흐름 속 의 데 이 터 를 집합 에 수집 하고 싶 습 니 다.어떻게 해 야 합 니까?
    stream 흐름 수집 방법
  • R collect(Collector collector)
  • 그러나 이 수집 방법의 매개 변 수 는 Collector 인터페이스
  • 이다.
    도구 류 Collectors 는 구체 적 인 수집 방법 을 제공 합 니 다.
  • Public static Collector toList():요 소 를 List 집합 에 수집 합 니 다
  • Public static Collector toSet():요 소 를 Set 집합 에 수집 합 니 다
  • Public static Collector toMap(Function keyMap,Function valueMap):요 소 를 맵 집합 에 수집 합 니 다
  • public class Demo8 {
        public static void main(String[] args) {
            //  List  
            List<String> list = new ArrayList<>();
            list.add("   ");
            list.add("   ");
            list.add("   ");
            list.add("  ");
    
            //  1:       3  
            Stream<String> lenStream = list.stream().filter(s -> s.length() == 3);
            //  2:               List   ,   
            List<String> names = lenStream.collect(Collectors.toList());
            names.forEach(System.out::println);
    
            //  Set  
            Set<Integer> set = new HashSet<>();
            set.add(10);
            set.add(20);
            set.add(30);
            set.add(40);
    
            //  3:      20  
            Stream<Integer> num = set.stream().filter(i -> i > 20);
            //  4:               Set   ,   
            Set<Integer> numStream = num.collect(Collectors.toSet());
            numStream.forEach(System.out::println);
    
            //         ,               
            String[] strArray = {"  ,12","    ,20","  ,22","  ,18"};
    
            //  5:          18  
            Stream<String> stringStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 18);
    
            //  6:            Map   ,      ,    
            Map<String, String> student = stringStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> s.split(",")[1]));
    
            //    
            Set<Map.Entry<String, String>> entries = student.entrySet();
            entries.forEach(s-> System.out.println("  :"+s.getKey()+",  :"+s.getValue()));
    
        }
    }40
                30,22,20
    
    

    좋은 웹페이지 즐겨찾기