zoukankan      html  css  js  c++  java
  • Java Lambda 表达式

    lambda表达式

    1.举例:(o1, o2) -> Integer.compare(o1, o2)


    2. 格式
      -> :lambda操作符或者箭头操作符
      ->左边 :lambda形参列表(其实就是接口中的抽象方法的形参列表)
      ->右边 :lambda体(其实就是重写的抽象方法的方法体)

    3.lambda表达式的本质:作为函数式接口实现类的实例

    4.lambda表达式的使用:
    分几种情况:

    public class Lambda01 {
    
        @Test
        public void test01(){
            // 无参数,无返回值
            Runnable run = ()-> System.out.println("无返回值");
            run.run();
    
            // 有参数,无返回值(数据类型可省略,有接口可推断出类型)
            Consumer<String> consumer = (s) -> {System.out.println(s);};
            consumer.accept("有参数,无返回值");
    
            // 若只有一个参数,参数的小括号可省略
            Consumer<String> consumer1 = s -> {System.out.println(s);};
            consumer.accept("省略小括号");
    
            // 可以有两个或以上的参数,多条执行语句,而且可以有返回值
            //传统匿名内部类写法
            Comparator<Integer> comparator = new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1.compareTo(o2);
                }
            };
            // lambda写法
            Comparator<Integer> comparator1 = (o1, o2) -> {
                System.out.println(o1);
                System.out.println(o2);
               return o1.compareTo(o2);
            };
            System.out.println(comparator1.compare(12, 21));
    
            // 当lambda体只有一条语句时,return 与大括号都可以省略
            Comparator<Integer> comparator2 = (o1, o2) -> o1.compareTo(o2);
            System.out.println(comparator2.compare(22, 21));
        }


    总结:
      ->左边:lambda形参列表类型可以省略(类型推断),如果lambda形参只有一个参数,可以省略括号
      ->右边:lambda体应该使用一对{}包裹,如果lambda体只有一条执行语句(可能是return语句),大括号和return都可以省略。

    5.函数式接口
    如果一个接口只有一个抽象方法,那么该接口就是函数式接口
    可通过lambda表达式来创建该接口的对象

    Java一直倡导“一切皆对象”
    6.所以以前用匿名实现类表示的现在都可以用lambda表达式来写

    7.函数式接口
    java内置四大核心函数式接口

    public class lambda02 {
    
        @Test
        public void test(){
    
            happyTime(500, d-> System.out.println("学习太累了"));
    
            List<String> stringList = Arrays.asList("北京", "天津", "南京", "东京", "普京");
            List<String> list = filterString(stringList, s -> s.endsWith("京"));
            System.out.println(list);
    
            List<String> upperStrings = stringUpper(Arrays.asList("hello", "java"), x -> x.toUpperCase());
            System.out.println(upperStrings);
        }
    
        public void happyTime(double money, Consumer<Double> consumer){
            consumer.accept(money);
        }
    
        // 根据给定的规则,过滤集合中的字符串,此规则有Predicate的test方法决定
        public List<String> filterString(List<String> list, Predicate<String> predicate){
            List<String> filterList = new ArrayList<>();
            for (String s: list) {
                if(predicate.test(s)){
                    filterList.add(s);
                }
            }
            return filterList;
        }
    
        // 根据给定的规则,加工集合中的字符串,此加工规则有Function(根据自变量x,输出因变量y 类似于y = ax + b的关系)
        // 的方法决定
        public List<String> stringUpper(List<String> list, Function<String, String> function){
            List<String> newArrayList = Lists.newArrayList();
            for (String s: list){
                newArrayList.add(function.apply(s));
            }
            return newArrayList;
        }
    }
  • 相关阅读:
    UI Automator Viewer工具的使用
    SQL数据库面试50题(转载)
    Python +selenium+pycharm(Windows)
    python安装及环境变量配置(Windows)
    JDK的安装与环境变量配置
    shell参数
    文件添加行号
    CentOS 7修改UTC为CST
    shell控制超时
    fio笔记
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/14425676.html
Copyright © 2011-2022 走看看