lambda表达式

lambda表达式是java8的重要特性

lambda表达式支持将一个表达式或者一个代码块作为参数,允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。lambda表达式可以用于简化创建匿名内部类对象。

lambda表达式的语法主要由三部分组成:

1 形参列表,如果只有一个参数可以省略括号,当无参数类型时可以使用()或者obj来代替。

2 箭头(->)

3 代码块部分,如果代码只有一行则可以省略掉花括号,不然使用花括号将lambda表达式的代码部分标记出来

lambda表达式的目标类型必须是函数式接口,函数式接口表示只包含一个抽象方法的接口。

Object不是函数式接口

——————————————————————————————————————

为了保证lambda表达式的目标类型是一个明确的函数式接口,有如下三种用法:

将lambda表达式赋值给函数式接口类型的变量

将lambda表达式当作参数传递给需要函数式接口类型的参数的调用方法

使用函数式接口对lambda表达式进行强制的类型转换

—————————————————————————————————————

lambda表达式的几种用法:

替代匿名内部类

@Test

public void oldRunnable(){

new Thread(new Runnable)({

@Override

public void run{

System.out.println("The old rannable now is using!");

}

});

}

***使用lambda表达式***

@Test

public void runnable(){

new Thread(() -> System.out.println("It's a lambda function!")).start();

}

使用lambda表达式对集合进行迭代

@Test

public void iterTest(){

List<String> languages = Arrays.asList("java","scala","python");

for(String each:languages){

System.out.println(each);

}

//after java8

languages.forEach(x -> System.out.println(x));

languages.forEach(System.out::println);//这一行看起来有点像c++里面作用域解析的写法,在这里也是可以的

}

用lambda表达式实现map

@Test

public void mapTest(){

List<Double> cost = Arrays.asList(10.0,20.0,30.0);

cost.steam().map(x -> x + x*0.05).forEach(x -> System.out.println(x));

}//map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。

用lambda表达式实现map与reduce

@Test

public void mapReduceTest(){

List<Double> cost = Arrays.asList(10.0,20.0,30.0);

double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum+x).get();

System.out.println(allCost);

}

filter操作

filter在操作集合时,经常需要从原始集合中过滤掉一部分元素。

@Test

public void filterTest(){

List<Double> cost = Arrays.asList(10.0,20.0,30.0,40.0);

List<Double> filteredCost = cost.stream().filter(x -> x >25.0).collect(Collectors.toList());

filteredCost.forEach(x -> System.out.println(x));

}

与函数式接口Predicate配合

除了在语言层面支持函数式编程风格,java8也添加了一个包java.util.function。Predicate接口非常适用于做过滤

public static void filterTest(List<String> languages,Predicate<String> condition){

languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));

}

public static void main(String[] args){

List<String>  languages = Arrays.asList("Java","Python","scala","Shell","R");

System.out.println("Language starts with J:");

filterTest(languages,x -> x.startsWith("J"));

}

Predicate方法表示判断输入的对象是否符合某个条件。

Funtion接受一个参数返回一个参数。

Consumer接受一个参数,不返回参数。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章