java基础---java8 新特性
1. 函数式接口
- 函数式接口主要指只包含一个抽象方法的接口,如:java.lang.Runnable(java1.0)、java.util.Comparator接口(java1.4)等。
- Java8提供@FunctionalInterface注解来定义函数式接口,若定义的接口不符合函数式的规范便会报错
- java.util.function包包含了常用的函数式接口
| 接口名称 | 方法声明 | 功能介绍 |
| Consumer | void accept(T t) | 根据指定的参数执行操作 |
| Supplier | T get() | 得到一个返回值 |
| Function<T,R> | R apply(T t) | 根据指定的参数执行操作并返回 |
| Predicate | boolean test(T t) | 判断指定的参数是否满足条件 |
2. lambda表达式
- 语法格式:(参数列表) -> { 方法体; } - 其中()、参数类型、{} 以及return关键字 可以省略
3.方法引用
- 通过方法的名字来指向一个方法而不需要为方法引用提供方法体,该方法的调用交给函数式接口执行
- 方法引用使用一对冒号 :: 将类或对象与方法名进行连接,通常使用方式如下:
- 对象的非静态方法引用 ObjectName :: MethodName
- 类的静态方法引用 ClassName :: StaticMethodName
- 类的非静态方法引用 ClassName :: MethodName
- 构造器的引用 ClassName :: new
- 数组的引用 TypeName[] :: new
- 方法引用是在特定场景下lambda表达式的一种简化表示,可以进一步简化代码的编写使代码更加紧凑简洁,从而减少冗余代码
package task02; import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier; public class Java8New {
public static void main(String[] args) {
//函数式接口
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return -1;
}
};
System.out.println(comparator.compare(1, 2));
System.out.println("---------------");
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("running");
}
};
runnable.run();
System.out.println("---------------");
Consumer consumer = new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
};
consumer.accept("函数式接口");
System.out.println("---------------");
Supplier supplier = new Supplier() {
@Override
public Object get() {
return "返回单个值";
}
};
System.out.println(supplier.get());
System.out.println("---------------");
Function function = new Function() {
@Override
public Object apply(Object o) {
return o;
}
};
System.out.println(function.apply("指定参数返回"));
System.out.println("---------------");
Predicate predicate = new Predicate() {
@Override
public boolean test(Object o) {
return false;
}
};
System.out.println(predicate.test("不满足条件"));
//lambda表达式
System.out.println("***************");
Comparator comparator1 = (Object o1, Object o2) -> -1;
System.out.println(comparator.compare(2, 3));
System.out.println("***************");
Runnable runnable1 = () -> System.out.println("running");
runnable1.run();
System.out.println("***************");
Consumer consumer1 = o -> System.out.println(o);
consumer1.accept("函数式接口");
System.out.println("***************");
Supplier supplier1 = () -> "返回单个值";
System.out.println(supplier.get());
System.out.println("***************");
Function function1 = o1 -> o1;
System.out.println(function1.apply("hello"));
System.out.println("***************");
Predicate predicate1 = o -> false;
System.out.println(predicate1.test("false")); //方法引用
System.out.println("======================");
Person person = new Person("hello");
Consumer<String> consumer2= person::setName;
consumer2.accept("zhangfei");
System.out.println(person.getName());
System.out.println("======================");
Supplier<String> supplier2=person::getName;
System.out.println(supplier2.get());
System.out.println("======================");
Function<String,Integer> function2=Integer::parseInt;
System.out.println(function2.apply("12345"));
System.out.println("======================");
Function<String,Person> function3=Person::new;
System.out.println(function3.apply("guanyu").getName());
System.out.println("======================");
Function<Integer,Integer[]>function4=Integer[]::new;
Integer[] apply = function4.apply(4);
for (Integer i:apply) {
System.out.println(i);
}
} }
4. Stream接口
- java.util.stream.Stream接口是对集合功能的增强,可以对集合元素进行复杂的查找、过滤、筛选操作
- 借助于Lambda 表达式极大的提高编程效率和程序可读性,同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势
- 创建
- 方式一:通过调用集合的默认方法来获取流,如:default Stream stream()
- 方式二:通过数组工具类中的静态方法来获取流,如:static IntStream stream(int[] array)
- 方式三:通过Stream接口的静态方法来获取流,如:static Stream of(T... values)
- 方式四:通过Stream接口的静态方法来获取流,static Stream generate(Supplier<? extends T> s)
- 筛选切片
| 方法声明 | 功能介绍 |
| Stream filter(Predicate<? super T> predicate) | 返回一个包含匹配元素的流 |
| Stream distinct() | 返回不包含重复元素的流 |
| Stream limit(long maxSize) | 返回不超过给定元素数量的流 |
| Stream skip(long n) | 返回丢弃前n个元素后的流 |
- 映射
| 方法声明 | 功能介绍 |
| Stream map(Function<? super T,? extends R> mapper) |
返回每个处理过元素组成的流 |
| Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper) |
返回每个被替换过元素组成的流,并 将所有流合成一个流 |
- 排序
| 方法声明 | 功能介绍 |
| Stream sorted() | 返回经过自然排序后元素组成的流 |
| Stream sorted(Comparator<? super T> comparator) | 返回经过比较器排序后元素组成的流 |
- 匹配与查找
| 方法声明 | 功能介绍 |
| Optional findFirst() | 返回该流的第一个元素 |
| boolean allMatch(Predicate<? super T> predicate) | 返回所有元素是否匹配 |
| boolean noneMatch(Predicate<? super T> predicate) | 返回没有元素是否匹配 |
| Optional max(Comparator<? super T> comparator) | 根据比较器返回最大元素 |
| Optional min(Comparator<? super T> comparator) | 根据比较器返回最小元素 |
| long count() | 返回元素的个数 |
| void forEach(Consumer<? super T> action) | 对流中每个元素执行操作 |
- 规约:
Optional reduce(BinaryOperator accumulator) 返回结合后的元素值 - 收集:
<R,A> R collect(Collector<? super T,A,R> collector) 使用收集器对元素进行处理
package task02; import java.util.ArrayList;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream; public class StreamTest {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("zhangfei", 30));
list.add(new Person("wangfei", 18));
list.add(new Person("lifei", 29));
list.add(new Person("sunfei", 25));
list.add(new Person("qianfei", 15));
list.add(new Person("zhaofei", 42));
list.add(new Person("zhangfei", 30)); //创建Stream
Stream<Person> stream = list.stream(); //操作
//Stream filter(Predicate<? super T> predicate) 返回一个包含匹配元素的流
stream.filter((Person person) -> {
return person.getAge() > 20;
}).forEach((Person person) -> System.out.println(person));
System.out.println("--------------");
//Stream distinct() 返回不包含重复元素的流
list.stream().distinct().forEach((Person person) -> System.out.println(person));
System.out.println("--------------");
//Stream skip(long n) 返回丢弃前n个元素后的流
//Stream limit(long maxSize) 返回不超过给定元素数量的流
//丢弃前2个返回后四个
list.stream().skip(2).limit(4).forEach((Person person) -> System.out.println(person));
System.out.println("--------------");
//方法声明 功能介绍
//Stream map(Function<? super T,? extends R> mapper) 返回每个处理过元素组成的流
list.stream().map(person -> person.getName()).forEach((String s) -> System.out.println(s));
//Optional findFirst() 返回该流的第一个元素
System.out.println(list.stream().findFirst());
//boolean noneMatch(Predicate<? super T> predicate) 返回没有元素是否匹配
System.out.println(list.stream().noneMatch(person -> person.getAge() > 25));
//方法声明 功能介绍
//Optional reduce(BinaryOperator accumulator) 返回结合后的元素值
System.out.print("sum");
System.out.println(list.stream().map((Person::getAge)).reduce((o1, o2) -> o1 + o2));
//方法声明 功能介绍
//<R,A> R collect(Collector<? super T,A,R> collector) 使用收集器对元素进行处理
list.stream().collect(Collectors.toList()).forEach((Person person) -> System.out.println(person));
}
}
5. Optional类的使用
- java.util.Optional类可以理解为一个简单的容器,其值可能是null或者不是null,代表一个值存在或不存在。该类的引入很好的解决空指针异常,不用显式进行空值检测。
| 方法声明 | 功能介绍 |
| static Optional ofNullable(T value) | 根据参数指定数值来得到Optional类型的对 象 |
| Optional map(Function<? super T,? extends U> mapper) |
根据参数指定规则的结果来得到Optional类 型的对象 |
| T orElse(T other) | 若该值存在就返回,否则返回other的数 值 |
package task02;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
//判断字符串是否为空,若不为空则打印字符串的长度,否则打印0
String s = "hello";
Optional<String> s1 = Optional.ofNullable(s);
System.out.println(s1.orElse("0"));//hello
String s2 = null;
Optional<String> s3 = Optional.ofNullable(s2);
System.out.println(s3.orElse("0")); //0
}
}
java基础---java8 新特性的更多相关文章
- Java基础-Java8新特性
一.Lambda表达式 在了解 Lambda 之前,首先回顾以下Java的方法. Java的方法分为实例方法,例如:Integer的equals()方法: public final class Int ...
- 【Java】Java8新特性
文章目录 Java8新特性 Lambda表达式的使用 语法格式一:无参,无返回值 语法格式二:Lambda 需要一个参数,但是没有返回值. 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为& ...
- 漫漫人生路-学点Jakarta基础-Java8新特性 Stream/Lambda
背景 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk dat ...
- Java基础20:Java8新特性终极指南
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 夯实Java基础系列21:Java8新特性终极指南
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- Java基础之java8新特性(1)Lambda
一.接口的默认方法.static方法.default方法. 1.接口的默认方法 在Java8之前,Java中接口里面的默认方法都是public abstract 修饰的抽象方法,抽象方法并没有方法实体 ...
- 【Java基础】Java8 新特性
Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...
- Java学习之==>Java8 新特性详解
一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
随机推荐
- 四:net core(.NET 6)使用Filter过滤器拦截webapi方法
Filter的基本用法 代码在最下方 使用filter过滤器,来实现拦截接口信息.咱们先新建一个项目,在原有的webapi上面,选择添加项目,添加一个类库项目: 我起个名字,就叫 Wsk.Core.F ...
- GO学习-(19) Go语言基础之网络编程
Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...
- 智能物联网(AIoT,2020年)(中)
智能物联网(AIoT,2020年)(中) 05 中国AIoT产业图谱 06 中国AIoT商业模式 标准程度越低人力和时间成本投入越多,2B2C模式附加值高 07 中国AIoT玩家分布简介 四类玩家,优 ...
- ISP_DPC坏点矫正
ISP_DPC坏点矫正 1. 坏点介绍 图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素 ...
- 新特性,推荐一款超强接口管理神器 Apifox
去年,在公众号给大家推荐了一款新面市不久的接口测试神器:Apifox,如果还未了解的读者,感兴趣的话可查阅原文:推荐一款技术人必备的接口测试神器:Apifox 为了照顾新进来的读者,且最近一年,Api ...
- 『言善信』Fiddler工具 — 8、Fiddler检查器(Inspectors)详解
目录 1.请求报文内容 2.响应报文内容 3.响应报文中Transformer选项说明 Inspectors意思是检查器.Inspectors可以使用多种方式,查看请求的请求报文和响应报文相关信息. ...
- QT基本数据类型
因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型. QT基本数据类型定义在#inclu ...
- Spring Cloud专题之二:OpenFeign
欢迎查看上一篇博客:SpringCloud专题之一:Eureka . OpenFeign是一种声明式的webservice客户端调用框架.你只需要声明接口和一些简单的注解,就能像使用普通的Bean一样 ...
- 一、Nginx的安装
1.下载nginx软件 http://nginx.org/download/ 2.安装依赖包 [root@client ~]# useradd -s /sbin/nologin nginx 创建ngi ...
- PTA题目集4-6总结
PTA题目集4-6总结 一:前言 在题集4-6中,所考查的主要知识点有正则表达式,类与类之间的调用,类的聚合,继承,封装,接口与多态,三种排序方法如选择排序,冒泡排序,插入排序,ArrayList,s ...