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

    参考:lambda表达式深入理解

    1.lambda表达式的使用目的

      .用于解决内部类使用时的冗余和不便,提供更简洁的语法

    2.lambda表达式的适用场景

      现有的类库大量使用了函数式接口,通过沿用这种模式,我们使得现有类库能够直接使用lambda表达式。例如下面是Java SE 7中已经存在的函数式接口:

       除此之外,Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:

    • Predicate<T>——接收T对象并返回boolean
    • Consumer<T>——接收T对象,不返回值
    • Function<T, R>——接收T对象,返回R对象
    • Supplier<T>——提供T对象(例如工厂),不接收值
    • UnaryOperator<T>——接收T对象,返回T对象
    • BinaryOperator<T>——接收两个T对象,返回T对象

      除了上面的这些基本的函数式接口,我们还提供了一些针对原始类型(Primitive type)的特化(Specialization)函数式接口,例如IntSupplierLongBinaryOperator。(我们只为intlongdouble提供了特化函数式接口,如果需要使用其它原始类型则需要进行类型转换)同样的我们也提供了一些针对多个参数的函数式接口,例如BiFunction<T, U, R>,它接收T对象和U对象,返回R对象。

    3.lambda表达式的注意事项 

      编译器会检查lambda表达式的类型和目标类型的方法签名(method signature)是否一致。当且仅当下面所有条件均满足时,lambda表达式才可以被赋给目标类型T

    • T是一个函数式接口
    • lambda表达式的参数和T的方法参数在数量和类型上一一对应
    • lambda表达式的返回值和T的方法返回值相兼容(Compatible)
    • lambda表达式内所抛出的异常和T的方法throws类型相兼容

      lambda表达式对 封闭,对 变量 开放

      

    int sum = 0;
    list.forEach(e -> { sum += e.size(); }); // Illegal, close over values
    
    List<Integer> aList = new List<>();
    list.forEach(e -> { aList.add(e); }); // Legal, open over variables

    4.lambda表达式的使用示例

      .Runnable

    package com.xdsux.java.thread;
    
    public class BasicThreads {
    
        public BasicThreads() {
            // TODO Auto-generated constructor stub
        }
        
        public static void main(String[] args) {
            
            //普通写法
            for (int i = 5; i > 0; i--) {
                Thread t = new Thread (new LiftOff());
                t.start();
                System.out.println("Waiting for LiftOff");
            }
            
            //lambda表达式
            for (int i = 5; i > 0; i--) {
                Thread t = new Thread(() -> System.out.println("lambda1."));
                t.start();
            }
            
        }
    
    }

      .ActionListener

    package com.xdsux.java.lambda;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class Main extends JFrame {
        
        private JButton jb;
        
        public Main() {
            
            this.setBounds(200, 400, 400, 200);
            this.setTitle("TestLanmda");
            
            jb = new JButton("click");
            //lambda
            //jb.addActionListener(event -> System.out.println("click"));
            jb.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    getClick();
                }
            });
            
            this.add(jb);
            
            this.setVisible(true);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
        
        public void getClick() {
            System.out.println("click1");
        }
        
        public static void main(String[] args) {
            new Main();
        }
    }

      .集合和Stream

    package com.xdsux.java.lambda;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class lambdaTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<String> ls = new ArrayList<>();
            ls.add("s1");
            ls.add("s2");
            Stream<String> s = ls.stream().map(p -> p.concat("lanbda3"));
            System.out.println(s.collect(Collectors.toList()));
        }
    
    }
  • 相关阅读:
    洛谷 P4708
    NFLSOJ 1060
    Codeforces 1264D
    Solution -「多校联训」Sample
    Solution -「多校联训」光影交错
    Solution -「LOJ #138」「模板」类欧几里得算法
    Solution -「LOJ #141」回文子串 ||「模板」双向 PAM
    Codeforces Round #700 (Div. 2)
    Codeforces Round #698 (Div. 2) C and D
    「NOI 2021」题解
  • 原文地址:https://www.cnblogs.com/xdsux/p/9669368.html
Copyright © 2011-2022 走看看