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


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