美文网首页
java8的lambda表达式和函数式接口

java8的lambda表达式和函数式接口

作者: WAHAHA402 | 来源:发表于2019-03-15 10:58 被阅读0次

本文目录:
1.lambda表达式
2.函数式接口
3.方法引用

1.lambda表达式

lambda表达式是一个可传递的代码块,可以执行多次。
先看语法:

基本语法:
(parameters) -> expression

(parameters) ->{ statements; }

使用实例

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和,如果此处不声明类型,将无法判断String还是int
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

lambda本身的语法比较简单。
这里要说另外一个知识点:函数式接口。

2.函数式接口

先看一下它的定义:

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口就称为函数式接口(functional interface)。

lambda的表达式可以配合函数式接口使用。比如:

Arrays.sort(words,
  (first, second)  -> first.length() - second.length());

sort方法会接收一个实现了Comparator<String>的某个类的实例,在这个对象上调用compare方法(Comparator中唯一的抽象方法)会执行这个lambda表达式的体。

Java API 在java.util.function包中定义了很多非常通用的函数式接口。其中一个接口BiFcuntion<T,U,R>描述了参数类型为T和U而且返回类型为R的函数。可以把我们的字符串比较lambda表达式保存在这个类型的变量中:

BiFunction<String, String, Integer> comp 
  = (first, second) -> first.length() - second.length();

不过这对于排序并没有帮助。因为Arrays.sort方法不接受一个BiFunction。类似Comparator的接口往往有一个特定的用途。想要用lambda表达式做某些处理,还要谨记表达式的用途,为它建立一个特定的函数式接口。

刚看函数式接口的时候,总不知道某一个是什么作用。其实想知道一个函数式接口的作用,接受什么参数返回什么值,只需点进去看一下它的抽象方法就可以了)
java.util.function包中有一个尤其有用的接口Predicate:

public interface Predicate<T>{
  boolean test(T t);
  ... // Addtional default and static methods
}

它的抽象方法接收一个对象,返回一个boolean类型的值,可以用来做条件判断。如ArrayList类有一个removeIf方法,它的参数就是Predicate。这个接口专门用来传递lambda表达式。例如,下面的语句将从一个数组列表删除所有null值:
list.removeIf(e -> e == null);

3.方法引用(method reference)

有时,可能已有现成的方法可以完成你想要传递到其他代码的墨菊个动作。例如,假设你希望只有出现一个定时器事件就打印这个事件对象。可以这样写:
Timer t = new Timer(1000, event -> System.out.println(event));
但是,如果直接把println方法传递到Timer构造器就更好了,如下:
Timer t = new Timer(1000, System.out::println);
表达式System.out::println是一个方法引用,等价于lambda表达式 x -> System.out.println(x).

下面字太多,贴图了:


方法引用.png

相关文章

  • Lambda表达式总结

    Lambda表达式总结使用范例以及例子Lambda表达式基础语法函数式接口Lambda练习Java8四大内置函数式...

  • Java Lambda表达式

    标签(空格分隔):java Lambda表达式是java8的重要更新,Lambda表达式的目标类型必须是函数式接口...

  • Java 函数式接口说明

    整理一下 Java8 之后的重要概念 函数式接口的说明和团队分享,这是函数式编程和 Lambda 表达式的基础。虽...

  • Lambda表达式

    Lambda表达式与函数式接口紧密相关,函数式接口介绍 Lambda表达式的基本语法 Java Lambda表达式...

  • Java8中你可能不知道的一些地方之函数式接口实战

    什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数...

  • Lambda表达式

    Lambda表达式是Java8的一个新特性,是函数式接口的一种体现。所谓函数式接口(functional inte...

  • Java8一些变态的特性

    引言 Java8里面增加了许多新特性。。。嗯,此处废话!!! Lambda表达式 函数式接口 要使用Lambda表...

  • JDK1.8-Lambda表达式

    一、Lambda表达式及函数式接口介绍 1. 描述 Lambda表达式是Java8中最重要的新功能之一。使用Lam...

  • 第七章 函数接口,lambda和方法引用

    java8 函数接口,lambda和方法引用 第四十二条, lambda 优先于匿名类(lambda表达式)1.函...

  • JDK8新特性 内置函数式接口

    1. 内置函数式接口由来 lambda表达式的前提是需要有函数式接口。而且lambda表达式使用时不关心接口名,抽...

网友评论

      本文标题:java8的lambda表达式和函数式接口

      本文链接:https://www.haomeiwen.com/subject/zuclmqtx.html