Java学习之随堂笔记系列——day23

昨天内容回顾:
    1、Lambda表达式 jdk1.8之后的新特性
        Lambda表达式的前提:
            1 Lambda表达式必须是接口类型。
            2、接口中有且仅有一个抽象方法。
        Lambda表达式的语法:
            (方法的参数列表)->{方法体}
        Lambda表达式的简化格式:
            1、任意情况下,参数列表中的参数类型都可以省略。
            2、如果参数列表只有一个参数,那么()可以省略。
            3、如果方法体中有且仅有一条语句,那么{}和;一起省略,如果有return,那么return也要一起省略。
        Lambda表达式的好处:
            简化匿名内部类的书写,但是不能完全替代匿名内部类。
        lambda表达式和匿名内部类的区别:
            1、能使用Lambda表达式的地方就一定可以使用匿名内部类,但是能使用匿名内部类的地方不一定能使用Lambda表达式。
            2、匿名内部类编译之后有class文件,lambda表达式编译之后不会产生class文件。
    2、接口新特性
        默认方法:
        静态方法:
        私有方法:
    3、方法引用:
        方法引用的好处:
            方法引用可以替换部分的Lambda表达式的书写。
        使用场景:
           如果Lambda表达式的的方法体中有且仅有一条语句,且符合 对象.方法() 、类名 .方法() 、new 类名() ,那么就可以使用方法引用
           代替Lambda表达式
        语法:
            对象.方法()------>对象::方法名    例如:System.out::println   注意:不需要写()
            类名 .方法()----->类名::方法名    例如:Integer::parseInt
            new 类名()------>类名::new      例如:Student::new
今日内容:
    1、函数式接口
       1、概念:有且仅有一个抽象方法的接口就叫做函数式接口。可以使用@FunctionalInterface注解检查。
            注意:一个接口是不是函数式接口和@FunctionalInterface没有任何关系,只和抽象方法的个数有关。如果这个接口不是函数式接口,
                那么加上这个注解之后就会编译报错。

            例如:JDK中的Runnable接口就是一个函数式接口
                @FunctionalInterface
                public interface Runnable {
                    public abstract void run();
                }
       2、使用场景:作为方法的参数或者返回值
       3、JDK中常见的函数式接口
            Supplier<T>:生产型接口
               T get():get()方法不需要给参数,反而给你返回一个T类型的值。
            Consumer<T>:消费型接口
                void accept(T t):需要一个T类型的参数,没有返回值,通过accept将T类型的数据交给我们使用(消费) (掌握)
                default Consumer<T> andThen(Consumer<? super T> after):将两个Consumer连接,分别消费数据

                例如:
                    //遍历输出  (T t)
                    list.forEach(num->System.out.println(num));
                    System.out.println("--------------");
                    //方法引用
                    list.forEach(System.out::println);

            Predicate<T>:判断型接口
                boolean test(T t):将给定的T类型的参数在test方法中进行条件判断,返回判断结果。

            Function<T,R>:转换型接口
                R apply(T t):将T类型的参数传递给方法,转换成R类型之后返回。

    2、Stream流
        概念:Stream流就是一套操作集合的工具集。工具集:指的就是Stream流中已经封装好了很多操作集合的方法,我们当作工具直接用就行了。
        Stream流操作的对象:单列集合、数组、Map集合(只能间接操作)。
        使用注意事项:Stream流对象只能被使用一次,否则会出现如下异常:
            java.lang.IllegalStateException: stream has already been operated upon or closed
        Stream流操作的步骤:
            1、生成Stream流对象
                Stream<T> stream=单列集合对象.stream();
                Stream<T> stream=Stream.of(T... t);
                注意:Map集合必须要先转换成单列集合(keySet()或者entrySet())之后才可以生成Stream流对象。
            2、调用Stream流对象的方法
                Stream<T> filter​(Predicate predicate):用于对流中的数据进行过滤,需要使用Predicate接口传递过滤条件
                Stream<T> limit​(long maxSize):截取前指定参数个数的数据,返回截取的元素组成的新流
                Stream<T> skip​(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的新流
                static <T> Stream<T> concat​(Stream a, Stream b):合并a和b两个流为一个流
                Stream<T> distinct​():对流中的元素去重(根据Object.equals(Object) )组成的流
                Stream<T> sorted​():返回由此流的元素组成的流,根据自然顺序排序
                Stream<T> sorted​(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序
                Stream<R> map​(Function mapper):将流中的数据转换成另一种类型进行存储,返回新的流对象。
                        Function转换型接口中的方法        R apply​(T t)
                void forEach​(Consumer action):遍历消费流中的数据
                long count​():返回此流中的元素个数

            3、将流中的数据转换成集合(可选操作)
                List<String> listA = streamA.collect(Collectors.toList());
                Set<Integer> setB = streamB.collect(Collectors.toSet());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值