Lambda 表達式的應用

lambda表達式

  • 函數式接口:只有一個方法的接口,好比Runnable和Comparator

先看幾個 lambda 表達式的例子進行理解html

(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 或java

(parameters) ->{ statements; }express

使用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);
複製代碼
相關文章
相關標籤/搜索