介绍
表达式描述()→1024年不需要参数,返回值为1024 x→2 * x接收参数x,返回其两倍(x, y)→x - y接收两个参数,返回它们的差(int x, int y)→x + y接收两个int类型参数,返回他们的和(String s)→打印(s)接收一个字符串对象,并打印
接口参数返回值类别示例ConsumerTvoid消费型接口打印输出某个值SupplierNoneT供给型接口工厂方法获取一个对象FunctionTR函数型接口获取传入列表的总和PredicateTboolean断言型接口判断是否以夏天为前缀
这篇文章给大家介绍λ表达式如何正确的在Java8中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
理解λ
λ表达式可以是一段可以传递的代码,它的核心思想是<强>将面向对象中的传递数据变成传递行为>强,也就是行为参数化,将不同的行为作为参数传入方法。
随着函数式编程思想的引进,λ表达式让可以用更加简洁流畅的代码来代替之前冗余的Java代码。
口说无凭,直接上个例子吧。在Java8之前,关于线程代码是这样的:
class Task implements Runnable { ,@Override ,public void  run (), { System.out.println才能(“Java8 之前,实现运行的接口中运行的方法“); ,} } Runnable t =, new 任务();
我们定义了一个任务类,让它实现运行的接口,实现仅有运行的方法,我们希望执行的线程体虽然只有一句话,但我们仍然花了大量大代码去定义。为了简化,我们可以采用匿名内部类的方式:
Runnable taskBeforeJava8 =, new Runnable (), { ,@Override ,public void  run (), { System.out.println才能(“Java8 之前的写法,,传入匿名类“); ,} };
但是,其实还是不够简洁,我们用λ的写法是这样的:
//, java8 之后 Runnable taskAfterJava8 =, (),→, System.out.println (“Java8 之后的写法,λ表达式“);
我们仅仅使用<代码>()代码>和<代码>→代码>就完成了这件事,是不是非常简洁呢?如果你觉得虽然λ写法简洁,但是它的规则让人摸不着头脑,那就跟着我接下去学叭。
基础语法
(参数),→行动 ,(参数)→表达 ,(参数)→,{语句;}
参数代表变量,可以为空,可以为单,可以为空,你能想到的方式他都可以。
操作是实现的代码逻辑部分,可以是一行代码<代码>表达式> 代码,也可以是一个代码片段<代码> 代码>语句。如果是代码片段,需要加上<代码>{}代码>。
下面是一些合法的示例,你可以看看有没有掌握:
表达式描述()→1024年不需要参数,返回值为1024 x→2 * x接收参数x,返回其两倍(x, y)→x - y接收两个参数,返回它们的差(int x, int y)→x + y接收两个int类型参数,返回他们的和(String s)→打印(s)接收一个字符串对象,并打印
函数式接口
@FunctionalInterface //,此注解作用的接口,只能拥有一个抽象方法 public interface  Runnable { ,public abstract  void 运行(); }
在这里,<代码> @FunctionalInterface 代码>注解是非必须的,有点类似于<代码> @Override> 代码,起强调作用,如果你的接口标注该注解,却没有遵循它的原则,编译器会提示你修改。
常用的函数式接口
JDK原生为我们提供了一些常用的函数式编程接口,让我们在使用他们编程时,不必关心接口名,方法名,参数名,只需关注它的参数类型,参数个数,返回值。
接口参数返回值类别示例ConsumerTvoid消费型接口打印输出某个值SupplierNoneT供给型接口工厂方法获取一个对象FunctionTR函数型接口获取传入列表的总和PredicateTboolean断言型接口判断是否以夏天为前缀
消费型接口
@FunctionalInterface //,此注解作用的接口,只能拥有一个抽象方法 public interface  Runnable { ,public abstract  void 运行(); }
供给型接口
/* * *,才能供给型接口,,无参数,返回T ,*/,public static void  supplierTest (), { Supplier<才能;Object>, supplier =, (),→, new 对象(); System.out.println才能(supplier.get ()); 以前,}>断言型接口
,/* * *,才能断言型,传入参数T ,返回布尔 ,*/,public static void  predicateTest (), { Predicate<才能;String>, predicate =, name →, name.startsWith (“summer"); System.out.println才能(predicate.test (“summerday")); 以前,}>函数型接口
,/* * *,才能函数型接口,传入T 返回R ,*/,public static void  functionTest (), { List<才能;Integer>, list =, new ArrayList<祝辞(arrays . aslist (1, 2, 3, 4, 5)); Function<才能;List< Integer>,, Integer>, function =, num →, { ,,int res =, 0; ,,for (int n :列表),{ ,,,res +=, n; ,,} ,,return res; ,,}; Integer 才能;num =,这个类(清单); System.out.println才能(num); 以前,}λ表达式如何正确的在Java8中使用