项目马上切java8了,之前对于java8的东西都是东打一棒西打一锤的了解了些。这次搜集整理了下,从lambda到stream相关的API等。

1.Lambda和匿名内部类

Lambda 是一个匿名的函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),我一直都认为它就是匿名内部类的变种进化。

匿名内部类:

//匿名内部类
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};

Lambda表达式:

//lambda表达式
Runnable runnable2 = () -> System.out.println("lambda");

2.Lambda语法:

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->”,将表达式分成两部分,左边是参数体,右边是Lambda体,需要函数式接口(接口中只有一个抽象方法的接口,称为函数式接口) 的支持,可以使用注解 @FunctionalInterface 修饰

几种语法格式:

其中:

  只有一个参数,可以省略小括号

  Lambda体只有一条语句可以省略{}

  参数类型可以省略,编译器可以通过上下文推断参数类型

        //无参无返回/大括号省略
Runnable runnable3 = () -> System.out.println("lambda"); //有参无返回/小括号省略
Consumer<String> consumer = (args) -> System.out.println(args);
Consumer<String> consumer2 = args -> System.out.println(args); //有参有返回值/参数类型省略
Function<Integer, Integer> function = x -> x + 1;
Function<Integer, Integer> function1 = (Integer x) -> x + 1;
//lambda体内正常逻辑操作
Function<Integer, Integer> function3 = (Integer x) -> {
if(x < 100) {
return x;
}
return x + 1;
};

3. java8 内置函数式接口(java.util.function包)

主要分为四种类型(主要就是对应几种方法类型,有参无返回,无参有返回,有参有返回)
Consumer<T> : 消费型接口
void accept(T t); Supplier<T> : 供应型接口
T get(); Function<T, R> : 功能型接口
R apply(T t); Predicate<T> : 断言型接口
boolean test(T t);

其他的几乎都是在这四种类型上面进行的扩展,比如 DoubleConsumer 指定了参数类型是double,void accept(double value); ,而Consumer的参数类型是泛型 void accept(T t);,再比如BiFunction和Function相比就是入参变成了两个R apply(T t);,R apply(T t, U u);

4.Lambda语法的另外一种形式 --- 方法引用

若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用,前提是接口抽象方法的参数和已经有方法的参数一致,表现形式如下:

1. 对象实例::实例方法名

2. 类名::静态方法名

3. 类名::实例方法名

注意: 第三种表现形式需要Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:ClassName::MethodName

        Student student = new Student(101, "张三", 18, 95);

        Supplier<String> sup = () -> student.getName();
System.out.println(sup.get());
//对象实例::实例方法名 同上
sup = student::getName;
System.out.println(sup.get()); Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
//类名::静态方法名 同上
Comparator<Integer> com1 = Integer::compare; //类名::实例方法名 第一个参数是Student实例 lambda体调用Student的show方法ClassName::MethodName
Function<Student, String> fun = Student::show;
System.out.println(fun.apply(student));

5.Lambda语法的另外一种形式 --- 构造器引用

构造器的参数列表,需要与函数式接口中方法参数列表保持一致

表现形式:类名::new

数组引用:函数式接口中方法参数是新数组的长度

表现形式:类型[]::new

        //构造器引用
Function<String, Student> fun1 = Student::new; Function<Integer, String[]> fun2 = (args) -> new String[args];
String[] strs = fun2.apply(2);
System.out.println(strs.length);
//数组引用 效果同上
Function<Integer, Student[]> fun3 = Student[]::new;
Student[] students = fun3.apply(20);
System.out.println(students.length);

Student代码:

    private int id;
private String name;
private int age;
private double score; public Student(String name) {
this.name = name;
} public Student(int id, String name, int age, double score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getScore() {
return score;
} public void setScore(double score) {
this.score = score;
} public String show() {
return "测试方法引用";
}

java8(1)--- lambda的更多相关文章

  1. java8(一)Lambda表达式

    其实很久前已经学习过了Lambda表达式,但是学习后没有多少使用的机会,久而久之也就忘记(惭愧).最近新的项目用的jdk8所以准备再学习一次,写下文章也是为了记录,方便以后再忘的时候,不用到处找资料( ...

  2. Java8初体验(一)lambda表达式语法

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解 ...

  3. Java8 特性详解(一) Lambda

    为什么要使用lambda表达式 从函数式接口说起 理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在. 函数式接口的定义其实很简单:任何接口,如果 ...

  4. Java-函数式编程(二)Lambda表达式

    本文首发:Java-函数式编程(二)Lambda表达式 “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lamb ...

  5. C#高级功能(一)Lambda 表达式

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ ...

  6. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  7. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

  8. Java基础之java8新特性(1)Lambda

    一.接口的默认方法.static方法.default方法. 1.接口的默认方法 在Java8之前,Java中接口里面的默认方法都是public abstract 修饰的抽象方法,抽象方法并没有方法实体 ...

  9. Java 8 vs. Scala(一): Lambda表达式

    [编者按]虽然 Java 深得大量开发者喜爱,但是对比其他现代编程语言,其语法确实略显冗长.但是通过 Java8,直接利用 lambda 表达式就能编写出既可读又简洁的代码.作者 Hussachai ...

随机推荐

  1. JAVA获取项目工程下的文件

    JAVA获取 工程下的文件  其实很简单主要是理解编译路径  ①class.getResource public static void main(String[] args) { WordTest ...

  2. Ural 2072:Kirill the Gardener 3(DP)

    http://acm.timus.ru/problem.aspx?space=1&num=2072 题意:有n朵花,每朵花有一个饥渴值.现在浇花,优先浇饥渴值小的(即从小到大浇),浇花需要耗费 ...

  3. django基础知识之HttpReqeust对象:

    HttpReqeust对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象 视图函数的第一个参数是HttpRequest对象 在django.http模块中定义了HttpR ...

  4. 图片去水印工具:Inpaint 7.2中文专业破解版下载及使用方法

    下载地址: 点我 Inpaint 是一款可以从图片上去除不必要的物体,让您轻松摆脱照片上的水印.划痕.污渍.标志等瑕疵的实用型软件:简单说来,Inpaint 就是一款强大实用的图片去水印软件,您的图片 ...

  5. android_sdcard读写(三)

    这次来个稍微复杂点的. package cn.com.sxp;import android.app.Activity;import android.app.ProgressDialog;import ...

  6. [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++

    Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...

  7. 洛谷P2319 [HNOI2006]超级英雄 题解

    题目链接: https://www.luogu.org/problemnew/show/P2319 分析 每错,这是一道海南不对是河南呀呀呀错了是湖南的省选题. 但是还是可以作为二分图第二题来练手的, ...

  8. 渐进式web应用开发---promise式数据库(五)

    在前面的一篇文章中,我们已经实现了使用indexedDB实现ajax本地数据存储的功能,详情,请看这篇文章.现在我们需要把上面的一篇文章中的代码使用promise结构来重构下.我们为什么需要使用pro ...

  9. C#3.0新增功能09 LINQ 基础01 语言集成查询

    连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 Inte ...

  10. [PTA] 数据结构与算法题目集 6-4 链式表的按序号查找 & 6-5 链式表操作集 & 6-6 带头结点的链式表操作集

    带不带头结点的差别就是,在插入和删除操作中,不带头结点的链表需要考虑两种情况:1.插入(删除)在头结点.2.在其他位置. 6.4 //L是给定单链表,函数FindKth要返回链式表的第K个元素.如果该 ...