lambda表达式是java8开始支持的一个特性,方便好用,使用lambda表达式进行编程可以明显提升开发效率,并且在执行效率上也有一定的优化。下面回顾一下lambda表达式的两部分常见用途。
一、针对函数式接口编程,匿名内部类的实现。
首先用个人语言来描述下函数式编程,就是接口中只含有一个接口方法,然后生成这个接口的实现类时只需要实现这一个接口方案就能构成一个实现类,此时就可以使用lambda表达式来实现这种匿名内部类,他是以一种函数的形式来表达的,前面为一个函数的输入,然后yige “->”后面接这个函数的方法体,下面以两个常见的例子来看,最常见的便是创建线程时u,这时我们最常使用匿名内部类的时候,在没有lambda表达式时,我们是这样实现的
Runnable runnable = new Runnable() { @Override public void run() { System.out.println("run ... "); } }; Thread thread = new Thread(runnable); thread.start();
runnable这个接口中只有一个未实现的方法run,所以我们可以使用lambda表达式来实现它,我们可以将上述代码简化为
new Thread(()->System.out.println("run ... ")).start();
()是run方法没有参数,所以以()表示,->以后为run方法的实现,这个就很想函数的形式,所以称为函数式编程
还有个我们比较常见的例子就是比较器,在没使用lambda表达式时是如下所示
List<String> list = Arrays.asList("aa", "abc", "abcdf", "v","java"); Collections.sort(list, new Comparator<String>(){// 接口名 @Override public int compare(String s1, String s2){// 方法名 if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); } });
使用了lambda表达式时这样
List<String> list = Arrays.asList("aa", "abc", "abcdf", "v","java");
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型 if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); });
Comparator接口只有compare一个接口方法,其中(s1, s2)是compare方法传入的参数,->以后为compare方法的实现。(s1,s2)没有参数类型,是因为java编译器可以通过后面参数的使用位置推断出参数的类型,故可以省略,当然,我们也可以不省略,写成(String s1,String s2)
二,流式操作,批量处理集合
在对集合的操作上使用lambda表达式其一是简化代码,不用写太多无用且必须的语句,其二,sream的流式操作默认使用了多线程的形式,可以在在待处理集合数据量大的情况下显著提升效率。
sream分为中间操作和结束操作两部分
其中详情见下表
操作类型 | 接口方法 |
---|---|
中间操作 | concat() distinct() filter() flatMap() limit() map() peek() skip() sorted() parallel() sequential() unordered() |
结束操作 | allMatch() anyMatch() collect() count() findAny() findFirst() forEach() forEachOrdered() max() min() noneMatch() reduce() toArray() |
其中中间方法是对集合进行操作,而结束操作是将处理完类型的sream的对象转换为结果的集合或者数值、字符串,流式操作的含义就是进行完一个处理后还可以继续以流的方式继续处理,比如先去重,然后排序。
下面介绍下常用的几个方法
distinct,去重
Stream<String> stream= Stream.of("aa", "abc", "abcdf", "v","java");
stream.distinct() .forEach(str -> System.out.println(str));
sort,排序
Stream<String> stream= Stream.of("aa", "abc", "abcdf", "v","java");
stream.sorted((str1, str2) -> str1.length()-str2.length()) .forEach(str -> System.out.println(str));