lambda表示式
- 函式式介面:只有一個方法的介面,比如Runnable和Comparator
先看幾個 lambda 表示式的例子進行理解
(int x,int y) -> x + y //接收x和y兩個整形引數,並返回他們的和
() -> 66 //不接收任何引數直接返回66
(String name) -> {System.out.println(name);} //接收一個字串然後列印出來
(View view) -> {view.setText("123");} //接受一個view物件並呼叫setText方法
複製程式碼
- lambda 表示式本質上是一個 由編譯器推斷並幫你轉換包裝為常規的程式碼,因此你可以使用更少的程式碼來實現同樣的功能
- 是java se 8 中的一個重要新特性。lambda表示式允許你通過表示式來代替介面功能
- 基本語法:
(parameters) -> expression 或
(parameters) ->{ statements; }
使用lambda 表示式遍歷集合
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
List<String> starList = Arrays.asList(stars);
starList.forEach((star) -> System.out.println(star));
//或者
starList.forEach(System.out::println);
複製程式碼
在使用匿名內部類的時候
- 比如建立執行緒,不適用lambda表示式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(1);
}
}).start();
複製程式碼
- 使用lambda 表示式
new Thread(()-> System.out.println(1)).start();
複製程式碼
集合排序
- 不使用lambda 表示式
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
Arrays.sort(stars, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
複製程式碼
- 使用lambda 表示式
Arrays.sort(stars,(String s1,String s2) -> (s1.compareTo(s2)));
複製程式碼
stream和lamda的結合使用
- 什麼是stream
- 若想要將一個集合中的某個屬性提取出來,比如下面這樣
List<Player>list = new ArrayList<>();
list.add(new Player("kobe","lakers",31,30000));
list.add(new Player("james","lakers",34,33000));
list.add(new Player("paul","rocket",34,20000));
list.add(new Player("hardon","rocket",31,20000));
List<String> names = new ArrayList<>();
for (Player player : list) {
names.add(player.getName());
}
for (String name : names) {
System.out.println(name);
}
複製程式碼
- 若使用lambda 表示式
List<String> names = list.stream().map(Player::getName).collect(Collectors.toList());
names.forEach(System.out::println);
複製程式碼
- 當然我們還可以進行更復雜一點的操作,給每個球員的分數加1000
list.forEach( s -> s.setScore(s.getScore() + 1000));
list.stream().map(Player::getScore).collect(Collectors.toList()).forEach(System.out::println);
複製程式碼
- 也可以過濾出分數大於30000 年齡小於32 的球員
list.stream()
.filter((p) -> (p.getScore() > 30000))
.filter((p) -> (p.getAge() < 32))
.collect(Collectors.toList())
.forEach(System.out::println);
複製程式碼
- 根據球員的分數來排序
list.stream()
.sorted((p1,p2) -> (p1.getScore()-p2.getScore()))
.collect(Collectors.toList())
.forEach(System.out::println);
複製程式碼