zoukankan      html  css  js  c++  java
  • lambda表达式

    lambda表达式

    lambda表达式的语法就不详细介绍了,直接上例子,快速的使用开发

    1.用 lambda 表达式实现 Runnable

    // Java 8 之前:
    new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Before Java8, too much code for too little to do");
    }
    }).start();
    
    //java 8 之后:
     new Thread(() ->{
                System.out.println("Before Java8, too much code for too little to do");
            } ).start();
    

    2.使用 Java 8 lambda 表达式进行事件处理

    // Java 8 之前:
    JButton show = new JButton("Show");
    show.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("Event handling without lambda expression is boring");
    }
    });
    // Java 8 方式:
    show.addActionListener((e) -> {
    System.out.println("Light, Camera, Action !! Lambda expressions Rocks");
    });
    

    3.使用 Java 8 lambda 表达式进行事件处理 使用 lambda 表达式对列表进行迭代

    // Java 8 之前:
    List<String> features = Arrays.asList
    ("Lambdas", "Default Method", "Stream API", "Date and Time API");
    for (String feature : features) {
    System.out.println(feature);
    }
    
    // java 8 之后:
     List features = Arrays.asList
     ("Lambdas", "Default Method", "Stream API", "Date and Time API");
     features.forEach(n-> System.out.println(n));
    //或者
     features.forEach(System.out::print);
    

    4.使用 lambda 表达式和函数式接口 Predicate

    //Predicate 接口非常适用于做过滤。
    public static void main(String[] args) {
            List<String> languages = Arrays.asList
                ("Java", "Scala", "C++", "Haskell", "Lisp");
            System.out.println("Languages which starts with J :");
            Predicate<String> predicate = (str)->str.startsWith("J");
            filter(languages, predicate);
        }
    // java 8 之前
    public static void filter(List<String> names, Predicate condition) {
            for(String name: names) {
                if(condition.test(name)) {
                    System.out.println(name + " ");
                } } }
    // java 8 之后
    public static void filter(List list,Predicate predicate){
            list.stream().filter((n)->predicate.test(n)).
                forEach((n)-> System.out.println(n));
        }
    

    5.如何在 lambda 表达式中加入 Predicate

    // 甚至可以用 and()、or()和 xor()逻辑函数来合并 Predicate,
    // 例如要找到所有以 J 开始,长度为四个字母的名字,你可以合并两个 Predicate 并传入
    List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
    Predicate<String> startJ = (str)->str.startsWith("J");
    Predicate<String> strLenthed = (str) -> str.length() <= 4;
    Predicate<String> and = startJ.or(strLenthed);
    languages.stream().filter(and).forEach((n)-> System.out.println(n));
    

    6.Java 8 中使用 lambda 表达式的 Map 和 Reduce 示例

    6.1.map示例

    //map允许你将对象进行转换
    // 不使用 lambda 表达式为每个订单加上 12%的税
    List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
    for (Integer cost : costBeforeTax) {
    double price = cost + .12*cost;
    System.out.println(price);
    }
    // 使用 lambda 表达式
    List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
    costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);
    

    6.2.reduce示例

    Map 和 Reduce 操作是函数式编程的核心操作,因为其功能,reduce 又被称为折叠操作。另外,reduce

    并不是一个新的操作,你有可能已经在使用它。SQL 中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是

    reduce 操作,因为它们接收多个值并返回一个值。流 API 定义的 reduceh() 函数可以接受 lambda 表达式,并对所 有值进行合并。IntStream 这样的类有类似 average()、count()、sum() 的内建方法来做 reduce 操作,也有

    mapToLong()、mapToDouble() 方法来做转换。这并不会限制你,你可以用内建方法,也可以自己定义。

    //
    // 为每个订单加上 12%的税
    // 老方法:
    List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
    double total = 0;
    for (Integer cost : costBeforeTax) {
    double price = cost + .12*cost;
    total = total + price;
    }
    System.out.println("Total : " + total);
    
    // 新方法:
    List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
    double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).
        reduce((sum, cost) -> sum + cost).get();
    System.out.println("Total : " + bill);
    

    7.通过过滤创建一个 String 列表

    // 创建一个字符串列表,每个字符串长度大于 2
    List costBeforeTax = Arrays.asList("abc","bcd","defg","jk");
    List<String> filtered = strList.stream().filter(x -> x.length()> 2).
        collect(Collectors.toList());
    System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);
    
    
    
    //输出:
    //Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg]
    

    8.对列表的每个元素应用函数

    // 将字符串换成大写并用逗号链接起来
    List<String> G7 = Arrays.asList
    ("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
    String G7Countries = G7.stream().
        map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
    System.out.println(G7Countries);
    
    
    
    //输出:
    //USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA
    

    9.复制不同的值,创建一个子列表

    本例展示了如何利用流的distinct() 方法来对集合进行去重

    // 用所有不同的数字创建一个正方形列表
    List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
    List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().
        collect(Collectors.toList());
    System.out.printf("Original List : %s, Square Without duplicates : %s %n", 
                      numbers, distinct);
    
    
    //输出:
    //Original List : [9, 10, 3, 4, 7, 3, 4], Square Without duplicates :
    //[81, 100, 9, 16, 49]
    

    10.计算集合元素的最大值、最小值、总和以及平均值

    IntStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。可

    以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种

    摘要数据。在本例中,我们用这个方法来计算列表的最大值和最小值。它也有 getSum() 和 getAverage() 方法来获

    得列表的所有元素的总和及平均值。IntStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。可 以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种摘要数据。在本例中,我们用这个方法来计算列表的最大值和最小值。它也有 getSum() 和 getAverage() 方法来获 得列表的所有元素的总和及平均值。

    //获取数字的个数、最小值、最大值、总和以及平均值
    List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
    IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
    System.out.println("Highest prime number in List : " + stats.getMax());
    System.out.println("Lowest prime number in List : " + stats.getMin());
    System.out.println("Sum of all prime numbers : " + stats.getSum());
    System.out.println("Average of all prime numbers : " + stats.getAverage());
    
    
    //输出:
    //Highest prime number in List : 29
    //Lowest prime number in List : 2
    //Sum of all prime numbers : 129
    //Average of all prime numbers : 12.9
    
  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/haocang/p/11730340.html
Copyright © 2011-2022 走看看