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接受一个参数,不返回参数。