Lambda表达式,案例一:new Thread(() -> System.out.println("thread"));

Lambda表达式,案例二:由参数/箭头和主体组成:

(Apple a1, Apple a2)  -> a1.getWeight().compareTo(a2.getWeight());

之前的代码形式:

Comparator<Apple> byWeight = new Comparator<Apple>() {
  public int compare(Apple a1, Apple a2) {

    return a1.getWeight().compareTo(a2.getWeight());

  }

}

针对这种情形,我们怎么理解呢?其实很简单,上看一下上述lambda表达式的语法:() -> {}(): 括号就是接口方法的括号,接口方法如果有参数,也需要写参数。只有一个参数时,括号可以省略。-> : 分割左右部分的,没啥好讲的。{} : 要实现的方法体。只有一行代码时,可以不加括号,可以不写return。在控制台打印,不返回任何值(看起来像是返回void)

函数式接口就是只显式声明一个抽象方法的接口。为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface,这样,当接口中声明的抽象方法多于或少于一个时就会报错。如下图所示:

Lambda表达式和函数式接口结合

步骤:

  1. 新建无参函数式接口(先演示无参);
  2. 新建包含属性为函数式接口的类;
  3. 实现函数式接口;
  4. 测试函数式接口的方法;

新建无参函数式接口

@FunctionalInterface
public interface InterfaceWithNoParam {
void run();
}

新建包含属性为函数式接口的类

public class TestJava8{

    //匿名内部类
InterfaceWithNoParam param1 = new InterfaceWithNoParam() {
@Override
public void run() {
System.out.println("通过匿名内部类实现run()");
}
};
//Lambda表达式
//空括号表示无参
InterfaceWithNoParam param = () -> System.out.println("通过Lambda表达式实现run()") ;
}

测试函数式接口的方法

@Test
public void testIntfaceWithNoparam() { this.param.run();
this.param1.run();
}

运行结果

其他形式的函数式接口及实现

上述内容实现了无参无返回值的函数接口与实现,当然还有其他形式:

有参无返回值

接口

@FunctionalInterface
public interface InterfaceWithParams {
void run(String s);
}

实现

InterfaceWithParams params = new InterfaceWithParams() {
@Override
public void run(String s) {
System.out.println("通过" + s + "实现run(String)");
}
};
InterfaceWithParams params1 = (String s) -> System.out.println("通过" + s + "实现run(String)");

测试

    this.params.run("匿名类");
this.params1.run("Lambda");

运行

无参有返回值

接口

@FunctionalInterface
public interface InterfaceUnVoidWithNoParam {
String run();
}

实现

InterfaceUnVoidWithNoParam interfaceUnVoidWithNoParam = new InterfaceUnVoidWithNoParam() {
@Override
public String run() {
return "Hello World!";
}
};
InterfaceUnVoidWithNoParam interfaceUnVoidWithNoParam1 = () -> "Hello Lambda!";

测试

    String s = this.interfaceUnVoidWithNoParam.run();
System.out.println("返回结果是:"+s);
String s0 = this.interfaceUnVoidWithNoParam1.run();
System.out.println("返回结果是:"+s0);

运行

有参有返回值

接口

@FunctionalInterface
public interface InterfaceUnVoidWithParams {
String run(Integer integer);
}

实现

InterfaceUnVoidWithParams interfaceWithParams = new InterfaceUnVoidWithParams() {
@Override
public String run(Integer integer) {
return String.valueOf(integer);
}
};
InterfaceUnVoidWithParams interfaceWithParams1 = (Integer integer) -> String.valueOf(integer);

测试

    String s1 = this.interfaceWithParams.run(1);
System.out.println("您输入的是:"+s1);
String s2 = this.interfaceWithParams1.run(2);
System.out.println("您输入的是:"+s2); 进一步深入案例:
java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。
接口 参数 返回值 类别 示例
Consumer T void 消费型接口 输出一个值
Supplier None T 供给型接口 工厂方法
Function T R 函数型接口 获得 Artist 对象的名字
Predicate T boolean 断言型接口 这张唱片已经发行了吗


 Predicate接口:(断言型接口)

@FunctionalInterface
interface Predicate<T> {

boolean test(T t);

}
/**
* 执行Predicate判断
* @param age 年龄
* @param predicate Predicate函数式接口
* @return 返回布尔类型结果
*/
public static boolean doPredicate(int age, Predicate<Integer> predicate) {
return predicate.test(age);
}

//Predicate<Integer> predicate = (age) -> age >= 18?true:false;

public static void main(String[] args) {
boolean isAdult = doPredicate(20, x -> x >= 18);
System.out.println(isAdult);
}
}

supply接口类:(供给类)

public static List<Integer> supply(Integer num, Supplier<Integer> supplier){
List<Integer> resultList = new ArrayList<Integer>() ;
for(int x=0;x<num;x++)
resultList.add(supplier.get());
return resultList ;
}

public static void main(String[] args) {
List<Integer> list = supply(6,() -> (int)(Math.random()*100));
list.forEach(System.out::println);
}

消费型接口示例:
public static void donation(Integer money, Consumer<Integer> consumer){
 consumer.accept(money);
}
public static void main(String[] args) {
 donation(1000, money -> System.out.println("好心的麦乐迪为Blade捐赠了"+money+"元")) ;
}
 
函数型接口示例: 转换字符串为Integer
 
public static Integer convert(String str, Function<String, Integer> function) {
 return function.apply(str);
}
public static void main(String[] args) {
 Integer value = convert("28", x -> Integer.parseInt(x));
}
 
断言型接口示例:(筛选出只有2个字的水果)
 
 
 
 
 

JDK8新特性:Lambda表达式的更多相关文章

  1. 大数据之路week06--day03(jdk8新特性 Lambda表达式)

    为什么使用Lambda表达式?(做为初学者接触这个新的语法,会很懵逼,说道理,我在接触到这一块的时候,语法规则我看到了也很懵逼,因为这个和逻辑的关系不是很大,但就是作为一种新的语法出现,一时间很难接受 ...

  2. JDK8 新特性 Lambda表达式

    1.java8中Lambda表达式基础语法: (x,y) -> {} 左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型: 中间是一个jd ...

  3. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  4. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  5. Java 8 新特性 - Lambda表达式

    Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析.一个关键的不同点就是关键字 this.匿名类的 this 关键字指向匿名类 ...

  6. C#10新特性-lambda 表达式和方法组的改进

    C# 10 中对Lambda的语法和类型进行了多项改进: 1. Lambda自然类型 Lambda 表达式现在有时具有"自然"类型. 这意味着编译器通常可以推断出 lambda 表 ...

  7. jdk8的新特性 Lambda表达式

    很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...

  8. JDK8的新特性——Lambda表达式

    JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. ...

  9. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  10. java8新特性——Lambda表达式

    上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...

随机推荐

  1. 清北学堂模拟赛d6t1 角谷猜想

    分析:不用删数字,我们考虑加入数字,维护一个栈,把不是4和7的数加进去,遇到3看栈顶是不是1,是的话弹出来就可以了. #include <bits/stdc++.h> #define N ...

  2. java GC垃圾回收机制G1、CMS

    CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间.对于要求服务器响应速度的应用上,这种垃圾回收器非常适合.在启动JVM参数加上-XX:+UseConcMa ...

  3. solaris11-text-安装GUI(gnome)

      http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=45057&id=3018467 1.下载所需的资源Text Ins ...

  4. lead 函数和 lag函数

    这两个函数的作用只能通过例子来解释,否则说不明白. 首先创建一个表 SQL> create table test (id number, name varchar2(8), val number ...

  5. firedac的数据序列和还原单元(Data.FireDACJSONReflect.pas)之拷贝FIREDAC数据集

    使用流做中转 procedure CopyDataSet(const ASource, ADest: TFDAdaptedDataSet);var LStream: TStream;begin LSt ...

  6. 鸟哥的Linux私房菜-----8、文件系统的装载

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. 新随笔(三)什么时候使用button,什么时候使用文字链接

    新随笔(三)什么时候使用button.什么时候使用文字链接 你为什么在这个地方用button而不用文字链接呢? 这是刚才我问一个设计师的问题. 她抬头看我,眼神迷茫.说:"没什么为什么呀,我 ...

  8. SqlService Date 格式化

    <choose> <when test="dateFlag=='day'"> ), FRI.INVOICE_DATE, ) AS CREATED_ON, & ...

  9. Single document interface和Multiple document interface

    https://en.wikipedia.org/wiki/Single_document_interface https://msdn.microsoft.com/en-us/library/b2k ...

  10. System.IO.Path

    System.IO.Path 分类: C#2011-03-23 10:54 1073人阅读 评论(0) 收藏 举报 扩展磁盘string2010c System.IO.Path提供了一些处理文件名和路 ...