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
    
  • 相关阅读:
    洛谷 P1706 全排列
    n皇后问题
    跳马
    [HDOJ4612]Warm up(双连通分量,缩点,树直径)
    [POJ3177]Redundant Paths(双连通图,割边,桥,重边)
    [POJ3352]Road Construction(缩点,割边,桥,环)
    [POJ3694]Network(LCA, 割边, 桥)
    [UVA796]Critical Links(割边, 桥)
    [UVA315]Network(tarjan, 求割点)
    [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)
  • 原文地址:https://www.cnblogs.com/haocang/p/11730340.html
Copyright © 2011-2022 走看看