zoukankan      html  css  js  c++  java
  • java-->lambda

    lambda表达式,jdk1.8的特性,但是用的少,现在才总结以下,哎!还需努力啊...

    import java.util.Arrays;
    import java.util.DoubleSummaryStatistics;
    import java.util.List;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    
    /**
     * 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
     * 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
     * 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
     * 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
     */
    public class LambdaTest {
    
        public static void main(String[] args) {
            //1.lambda 表达式代替匿名内部类
            System.out.println("1-----------------");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("内部类写法");
                }
            }).start();
    
            new Thread(() -> System.out.println("lambda表达式")).start();
    
            //2.lambda表达式对列表进行迭代
            System.out.println("2-----------------");
            List<String> list = Arrays.asList("java","c++","python","go");
            list.forEach(n -> System.out.println(n));
    
            //3.使用lambda表达式和函数式接口Predicate
            System.out.println("3-----------------");
            List<String> list1 = Arrays.asList("java","c++","python","go");
            Predicate<String> p1 = (n)->n.startsWith("j");
            Predicate<String> p2 = (n)->n.length() >= 4;
            list1.stream().filter(p1).forEach(n-> System.out.println(n));
            list1.stream().filter(n->n.startsWith("j")).forEach(n-> System.out.println(n));
    
            //4.Predicate之多个过滤条件
            System.out.println("4-----------------");
            list1.stream().filter(p1.and(p2)).forEach(n-> System.out.println(n));
            list1.stream().filter(p1.or(p2)).forEach(n-> System.out.println(n));
    
            //5.lambda表达式之map
            System.out.println("5-----------------");
            List<Double> list2 = Arrays.asList(30.0,50.0,80.0,100.0);
            list2.stream().map(n->n*0.2).forEach(n-> System.out.println(n));
    
            //6.lambda表达式之reduce()
            System.out.println("6---------------------");
            System.out.println(list2.stream().map(n->n*0.2).reduce((sum,n)->sum+n).get());
    
            //7.lambda表达式之collect()
            System.out.println("7---------------------");
            List<Double> result = list2.stream().filter(n->n>=50).collect(Collectors.toList());
            result.forEach(n-> System.out.println(n));
    
            //8.lambda表达式之distinct()去重
            System.out.println("8---------------------");
            List<String> list3 = Arrays.asList("java","c++","python","go","java","c++","python","go","go");
            List<String> result2 = list3.stream().filter(n->n.startsWith("j")).distinct().collect(Collectors.toList());
            result2.forEach(n-> System.out.println(n));
    
            //9.计算集合元素的最大值,最小值等
            System.out.println("9---------------------");
            DoubleSummaryStatistics result3 = list2.stream().mapToDouble(n->n).summaryStatistics();
            System.out.println(result3.getMax());
            System.out.println(result3.getMin());
            System.out.println(result3.getSum());
            System.out.println(result3.getAverage());
            System.out.println(result3.getCount());//个数
    
            //10.lambda表达式有个限制,那就是只能引用 final 或 final 局部变量,这就是说不能在lambda内部修改定义在域外的变量。
    
            System.out.println("10---------------------");
            int aa = 0;
            //list2.forEach(n-> System.out.println(aa++)); //Error:(79, 46) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
        }
    
    }

    对应打印结果

    1-----------------
    内部类写法
    2-----------------
    lambda表达式
    java
    c++
    python
    go
    3-----------------
    java
    java
    4-----------------
    java
    java
    python
    5-----------------
    6.0
    10.0
    16.0
    20.0
    6---------------------
    52.0
    7---------------------
    50.0
    80.0
    100.0
    8---------------------
    java
    9---------------------
    100.0
    30.0
    260.0
    65.0
    4
    10---------------------
  • 相关阅读:
    Rsync常见运维操作命令
    [图文详解] Sublime Text在Windows/Ubuntu/Mac OSX中配置使用CTags
    Sublime Text : 创建工程
    Sublime Text 插件 & 使用技巧
    如何解决adb devices 端口被占用的问题zz
    Nginx 服务器安装及配置文件详解
    把notepad++设置为系统全局文本默认打开应用
    Ubuntu 下载 & 编译 Android5.1 源码
    同步、更新、下载Android Source & SDK from 国内镜像站
    如何为Linux生成和打上patch
  • 原文地址:https://www.cnblogs.com/cai170221/p/13577682.html
Copyright © 2011-2022 走看看