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年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
随机推荐
- Jmeter(四十八) - 从入门到精通高级篇 - Jmeter监控服务器性能(详解教程)
1.简介 JMeter是一款压力.接口等等的测试工具,Jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,用来监控服务器资源使用情况,不过需要安装一些插件.JMeter正常自 ...
- MyBatis-框架使用和分析
一.基础知识 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.MyBatis 可 ...
- Python+Selenium自动化总结
Python+Selenium自动化总结 1.环境搭建 1.1.安装selenium模块文件 pip install selenium 1.2.安装ChromeDriver驱动 [1]下载安装Chro ...
- Mysql索引创建及删除
1.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...
- 在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据
在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据 如今,最流行的拍照设备智能手机可以捕获高达4K UHD的图像(3840×2160图像),原始数据超过25 MB.即使 ...
- vue根据变量值绑定src的路径
路径必须用require包裹起来才会起作用
- 2020想进大厂你不得不了解的MySQL意外事件的查询技巧
导读:数据库是导致应用系统运行缓慢的常见原因.面对数据库引性能问题,很多开发者或者DBA却束手无策.本文作者经过多年的实际经验,整理了一些材料,将Linux环境下MySQL性能突发事件问题排查技巧分享 ...
- 使用Spring Data JPA 访问 Mysql 数据库-配置项
jpa操作数据库 注意:数据库采用的是本机数据库,下面是建表语句及初始化数据: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------- ...
- javascript之一切都是对象
在学习的过程中,我们常常能听到这样一句话:一切皆是对象.那么这句话该如何理解呢?首先,我们要明确对象的概念.要明白除了基本数据类型都是对象. typeof操作符是大家经常使用的,我们常用它来检测给定变 ...
- js笔记15
DOM2动态创建节点 1.生成节点的方法 document.createElement("div") 2.插入节点的方法 父元素.appendChild(新节点) 在父节点的子节点 ...