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年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
随机推荐
- 情景剧:C/C++中的未定义行为(undefined behavior)
写在前面 本文尝试以情景剧的方式,轻松.直观地解释C/C++中未定义行为(undefined behavior)的概念.设计动机.优缺点等内容1,希望读者能够通过阅读本文,对undefined beh ...
- 目标检测coco数据集点滴介绍
目标检测coco数据集点滴介绍 1. COCO数据集介绍 MS COCO 是google 开源的大型数据集, 分为目标检测.分割.关键点检测三大任务, 数据集主要由图片和json 标签文件组成. c ...
- AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)
AlexeyAB DarkNet YOLOv3框架解析与应用实践(四) Nightmare 从前,在一所大学的大楼里,西蒙尼亚.维达第和齐瑟曼有一个很好的主意,几乎和你现在坐的大楼完全不同.他们想,嘿 ...
- TVM 架构设计
TVM 架构设计 本文面向希望了解TVM体系结构和/或积极参与项目开发的开发人员. 主要内容如下: 示例编译流程概述了TVM将模型的高级概念转换为可部署模块的步骤. 逻辑架构组件部分描述逻辑组件.针对 ...
- MapReduce——客户端提交任务源码分析
计算向数据移动 MR程序并不会在客户端执行任何的计算操作,它是为计算工作做好准备,例如计算出切片信息,直接影响到Map任务的并行度. 在Driver中提交任务时,会写到这样的语句: boolean r ...
- python路径写入注册表,导入三方模块win32
python在安装第三方模块时候,需要将python的路径写入注册表,否则会提示 'python version 3.8-32 required,which was not found in the ...
- 【NX二次开发】Block UI 整形
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- Java知识复习(四)
最近准备跳槽,又要好好复习基本知识了.过了个年,前面刚接触的springboot也只能先放放了.就先把自己复习了哪些罗列出来吧. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用== ...
- k8s1.20环境搭建部署(二进制版本)
1.前提知识 1.1 生产环境部署K8s集群的两种方式 kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群 ...
- Kubernetes通过downwardAPI传递元数据
应用往往需要获取所运行环境的一些信息,包括应用自身以及集群中其他组件的信息.Kubernetes可以通过环境变量以及DNS进行服务发现,但其他信息如何处理呢?下面将介绍特定pod和容器元数据如何被传递 ...