Lambda表达式的用途有哪些

参考答案

Lambda表达式的四个主要用途:

1.替代匿名内部类

  • Lambda表达式用得最多的场合,是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。
  • Lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类。

匿名内部类与Lambda表达式的使用实例对比:

1.1  使用匿名内部类

@Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }

1.2  使用Lambda表达式

@Test
  public void runable() {
      new Thread(() -> System.out.println("It's a lambda function!")).start();
  }

输出结果:

The old runable now is using!
It's a lambda function!

Lambda表达式用极少的代码完成了之前一个类做的事情,让代码变得异常简洁

2.  使用lambda表达式对集合进行迭代

@Test
  public void iterTest() {
      List<String> languages = Arrays.asList("java","scala","python");
      //before java8
      for(String each:languages) {
          System.out.println(each);
      }
      //after java8
      languages.forEach(x -> System.out.println(x));
      languages.forEach(System.out::println);
  }

用forEach不陌生迭代集合中所有的对象,并且将lambda表达式带入其中。

languages.forEach(System.out::println);

3.  Stream操作

  • Stream是Java8提供的对于元素集合统一、快速、并行操作的一种方式,它能充分运用多核的优势,以及配合lambda表达式、链式结构对集合等进行许多有用的操作。
  • Stream如同一个迭代器(Iterator),单向、不可往复,数据只能遍历一次,遍历过一次后就用尽了,像流水流过,一去不返。

简单介绍几个主要方法:

3.1   filter(过滤)

//过滤18岁以上的人
List persons = …
Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18);

3.2   Map(映射)

如果想通过某种操作,把一个流中的元素转化成新的流中的元素,可以使用 map() 方法。

public class MapStreamDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("周杰伦");
        list.add("王力宏");
        list.add("陶喆");
        list.add("林俊杰");
        Stream<Integer> stream = list.stream().map(String::length);
        stream.forEach(System.out::println);
    }
}

结果:

3
3
2
3

3.3  limit(截断)

对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素。

3.4  distinct(去重)

对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素

3.5  count(统计)

count方法是一个流的终点方法,可使流的结果最终统计,返回int,比如我们计算一下满足18岁的总人数。

int countOfAdult=persons.stream()
                       .filter(p -> p.getAge() > 18)
                       .map(person -> new Adult(person))
                       .count();

3.6   Collect(收集流的结果)

collect方法也是一个流的终点方法,可收集最终的结果

List adultList= persons.stream()
                       .filter(p -> p.getAge() > 18)
                       .map(person -> new Adult(person))
                       .collect(Collectors.toList());

4.  与函数式接口Predicate配合

除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。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"));
    System.out.println("\nLanguage ends with a: ");
    filterTest(languages,x -> x.endsWith("a"));
    System.out.println("\nAll languages: ");
    filterTest(languages,x -> true);
    System.out.println("\nNo languages: ");
    filterTest(languages,x -> false);
    System.out.println("\nLanguage length bigger three: ");
    filterTest(languages,x -> x.length() > 4);
}

结果:

Language starts with J: 
Java 

Language ends with a: 
Java 
scala 

All languages: 
Java 
Python 
scala 
Shell 
R 

No languages: 

Language length bigger three: 
Python 
scala 
Shell

以上,是Java面试题【Lambda表达式的用途有哪些】的参考答案。

 

输出,是最好的学习方法。

立即行动,在评论区记录下你的问题、笔记或补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧