Lambda表达式的几种方式-003

2019-01-22  本文已影响0人  小尾巴1024

方式一:无参函数的写法

//无参数方式
new Thread(
        () -> System.out.println("Hello,Wei") // 省略接口名和方法名
).start();
//Java7的写法
new Thread(new Runnable(){   // 接口名
    @Override
    public void run(){// 方法名
        System.out.println("Hello,Wei");
    }
}).start();

方式二:有参函数的写法

//两个参数
List<String> list = Arrays.asList("I", "am", "zeng", "wei");
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型
    if(s1 == null)
        return -1;
    if(s2 == null)
        return 1;
    return s1.length()-s2.length();
});
//Java7写法
List<String> list = Arrays.asList("I", "am", "zeng", "wei");
Collections.sort(list, new Comparator<String>(){
  @Override
    public int compare(String s1, String s2){  // 方法名
        if(s1 == null)
            return -1;
        if(s2 == null)
            return 1;
        return s1.length()-s2.length();
    }
});

方法三:参数带类型写法

方式二的带参是没有写参数类型的,这在lambda表达式中是被允许的,因为Lambda可以根据上下文推断出类型,但是也可以把类型写上

//参数带上类型
List<String> list = Arrays.asList("I", "am", "zeng", "wei");
Collections.sort(list, (String s1, String s2) ->{
    if(s1 == null)
        return -1;
    if(s2 == null)
        return 1;
    return s1.length()-s2.length();
});

方式四:代码块的写法

方式一可以看到,只有一行代码,所以不用加上大括号‘{}’,但是如果有多选代码,如方式二和方式三,就要加上大括号‘{}’。

new Thread(
        () -> {  // 多行代码加上‘{}’
      System.out.println("Hello,Wei") ;
      System.out.println("Hello,I am fine");
  }
).start();

方式五:自动返回值和手动返回值写法

  // 自动返回(a/b)     
 MathOperation division = (int a, int b) -> a / b;
// 手动添加return返回
MathOperation multiplication = (int a, int b) -> { return a * b; };
//函数接口
interface MathOperation {
      int operation(int a, int b);
   }

方式六:双冒号表达式

//双冒号可以调用方法
public class LambdaTest {
    
  public static void printStr(String str) {
    System.out.println(str);
  }

  public static void main(String[] args) {

    List<String> list = Arrays.asList("aaa","bbb","ccc");
    // 1.通常的遍历方式
    for(String str: list) {
      LambdaTest.printStr(str);
    }
    // 2.使用Lambda表达式遍历
    list.forEach(str -> {
      LambdaTest.printStr(str);
    });
    // 3.使用::遍历
    list.forEach(LambdaTest::printStr);
    // 下面的方法和上面等价,使用的是函数式编程
    Consumer<String> methodParam = LambdaTest::printStr; //方法参数
    list.forEach(x -> methodParam.accept(x));//方法执行accept
  }
}
//双冒号调用构造方法
() -> new HashMap<>();
HashMap::new

参考:https://segmentfault.com/a/1190000015308249
http://www.runoob.com/java/java8-lambda-expressions.html

上一篇下一篇

猜你喜欢

热点阅读