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接受一個參數,不返回參數。