Java8新特性。
常用函数接口:
函数式接口:
函数式接口在Java中是指:有且仅有一个抽象方法的接口(可以含其他方法)。
而Java中的函数式编程的体现就是Lambda。
@FunctionalInterface 注解:检测接口是否是函数式接口。
函数式接口的使用:一般可以作为方法的参数和返回值类型。
Lambda表达式有延迟执行的特点,可提高程序运行效率。
性能浪费案例:
@java.lang.FunctionalInterface
public interface FunctionalInterface {
public abstract void method();
}
public class Demo {
//定义一个方法,参数使用函数式接口
public static void show(FunctionalInterface myInter){
myInter.method();
}
public static void main(String[] args) {
//方法的参数是一个接口,所以可以传递接口的实现类
show(new MyFunctionalInterfaceImpl());
//也可以传递接口的匿名内部类
show(new FunctionalInterface() {
@Override
public void method() {
System.out.println("匿名内部类");
}
});
//方法的参数也是一个函数式接口,所以可以用Lambda。
show(()-> System.out.println("Lambda"));
}
}
以上代码中存在性能浪费的问题,
Lambda作为返回值:在调用show方法时,如果level不等于1,那么第二个参数字符串拼接的操作就相当于白做了。
使用Lambda进行优化:
public class Logger {
public static void show(int level,MessageBuilder mb){
if (level==1)
System.out.println(mb.messageBuilder());
}
public static void main(String[] args) {
String s1="Hello";
String s2="World";
show(1,()->{return s1+s2;});
}
}
以上代码中,只是将参数传递到show方法中,只有条件满足,才会执行拼接操作。
常用函数式接口:
* Supplier :生产型接口。Supplier<T> T get() 。用来返回泛型参数指定类型的对象。
public class test {
public static String getString(Supplier<String> stringSupplier){
return stringSupplier.get();
}
public static void main(String[] args) {
String s=getString(()->"rt");
System.out.println(s);
}
}
* Consumer:消费型接口。accept() 对接收的泛型参数进行消费(处理)
public class test {
public static void consume(String name,Consumer<String> consumer){
consumer.accept(name);
}
public static void main(String[] args) {
consume("rt",(String name)-> System.out.println(name));
}
}
Consumer中的默认方法andThen:可以将两个Consumer接口组合到一起,再对数据消费。
* Predicate:对某种类型的数据进行相关判断。boolean test(T t)
public class test {
public static boolean checkString(String s,Predicate<String> predicate){
return predicate.test(s);
}
public static void main(String[] args) {
String name="abc";
boolean b=checkString(name,s -> s.length()>3);
System.out.println(b);
}
}
默认方法 and : 返回多个test的与关系值。
public class test {
public static boolean checkString(String s,Predicate<String> predicate1,Predicate<String> predicate2){
return predicate1.and(predicate2).test(s); // 相当于:return predicate1.test(s)&&predicate2.test(s);
}
public static void main(String[] args) {
String name="abc";
boolean b=checkString(name,s -> s.length()>2,s -> s.contains("a"));
System.out.println(b);
}
}
默认方法: or : 或 negate :非。
* Function 接口: Function<T,R> 根据一个类型的数据得到另一个类型的数据。
R apply(T t ) 根据类型T 的参数 获取类型R 的结果。
public class test {
public static void change(String s, Function<String,Integer> function){
Integer integer=function.apply(s);
System.out.println(integer);
}
public static void main(String[] args) {
String string="123";
change(string,s -> Integer.parseInt(s));
}
}
默认方法:andThen :组合操作。
public class test {
/*
将String转为Integer ,加10,然后转为String。
*/
public static void change(String s,Function<String,Integer> function1,Function<Integer,String> function2){
String str=function1.andThen(function2).apply(s);
System.out.println(str);
}
public static void main(String[] args) {
String str="123";
change(str,s -> Integer.parseInt(s)+10,i->i.toString());
}
}
Stream流式思想:
Stream 流的方式,遍历集合,对集合中的数据进行过滤。
Stream流是JDK1.8 之后出现的。
public class Demo {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("张玉昊");
list.add("胡云钰");
list.add("张日天");
list.add("张天");
list.stream().filter(name->name.startsWith("张"))
.filter(name->name.length()==3)
.forEach(name-> System.out.println(name));
}
}
获取Stream流:
java.util.stream.Stream<T> ,是Java8 加入的最常用的流接口。
1、所有的Collection集合都有stream方法来获取流 default Stream<E> stream()
2、Stream接口的静态方法of可以获取数组对应的流。 static <T> Stream<T> of (T...values)
Stream流的常用方法:
forEach:
forEach用来遍历流中的数据
该方法接收一个Consumer接口函数,会将流元素交给该函数处理
Consumer接口是一个消费型的函数式接口,可以传递lambda表达式,消费数据
forEach是一个终结方法,遍历之后就不能再使用Stream其他方法
filter:
filter用来对Stream流中的数据进行过滤,并生成新的流,可以用Lambda。
map:
将流中元素映射到另一个流中,可以将当前T类型的流转换为R类型的流。
public static void main(String[] args) {
Stream<String> stream = Stream.of("1", "2", "3");
Stream<Integer> stream1 = stream.map(number -> Integer.parseInt(number));
stream1.forEach(number-> System.out.println(number));
}
count:
count方法用于统计Stream流中的元素个数,返回Long类型的整数。
count方法是一个终结方法。
limit:
limit方法,延迟方法,对流中的元素截取前几个,返回新的流。limit(Long maxsize),
skip:
跳过前几个元素,返回新的流,skip(long n)
concat:
concat:把流组合到一起,concat(流1,流2);
Stream流的特点:
Stream流属于管道流,只能被使用一次。第一个Stream流调用完毕方法,数据就会流转到下一个Steam流,当前Stream流则关闭。
方法引用:
Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda表达式。
Lambda表达式的作用,就是实现接口的方法,也就是写 “该怎么做”,而当“该怎么做”只是一个方法调用时,只需要写“该怎么做”的方法即可,来代替Lambda。
1、通过对象引用成员方法。
public class test {
public static void print(Printable p){
p.print("Hello");
}
public static void main(String[] args) {
print(s->{
PrintString pt=new PrintString();
pt.printString(s);
});
PrintString pt=new PrintString();
print(pt::printString);
}
}
2、通过类名引用静态方法,类名::静态方法。
Java8新特性。的更多相关文章
- java8新特性全面解析
在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...
- Java8新特性
Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...
- Java系列 - 用Java8新特性进行Java开发太爽了
本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...
- Java8 新特性之Stream----java.util.stream
这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...
- 这可能是史上最好的 Java8 新特性 Stream 流教程
本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
- Java8新特性(一)_interface中的static方法和default方法
什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...
- Java8 新特性 | 如何风骚走位防止空指针异常
文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...
- 干货 | Java8 新特性教程
本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
随机推荐
- [RN] 可播放视频的播放器版本
可播放视频的播放器版本 "react": "16.6.3", "react-native": "0.57.8", &qu ...
- Computer-Hunters——凡事预则立
Computer-Hunters--凡事预则立 冲刺时间安排 时间 前端计划完成工作 11.6 完成用户注册登录界面,个人信息界面,以及热点资讯界面 11.7-11.8 匹配界面,电脑猎场界面 11. ...
- [Gamma] 发布说明
[Gamma] 发布说明 发布网址为http://60.205.230.0 新功能前瞻 团队合作:支持多人合作完成项目 项目进度管理:便于监控项目进度 站内信系统:团队合作与审核需要 已知BUG修复 ...
- ASP.NET 网站迁移 HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用
前提:今天要做网站迁移,把A服务器上的网站迁移到B服务器上,A服务器当时的环境是.NET 4.0 ,而B服务器是.NET2.0,A服务器IIS为6.0,B服务器IIS版本为7.0 第一步,先在B服务 ...
- spring boot2X整合Consul一使用RestTemplate实现服务调用
Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡——通过Ribbon注解RestTemplate B.使用Feign ...
- Web Api 实现新建功能接口
ResultModel类 是一个结果类 public class ResultModel { /// <summary> /// 返回结果状态 /// </summary> p ...
- [原创]K8Cscan插件之Host2IP(批量域名解析/主机名转IP)
0x001 前言 在内网渗透中,有时候通过域或日志导出一些机器名,或者管理员备分文件等方式获取 只有主机名或者域名时,就需要先解析出IP获取相关IP或IP段,才好进行下一步扫描. 0x002 用法 首 ...
- linux ------ 在Vm 安装 centos系统
------------- 简介 熟悉的操作系统*(android apple windows) 主要分类 1.应用领域(桌面.服务器.嵌入式) 2.源码开放程度(开源.闭源) 3.所支持的用户数 ...
- fp-growth代码问题(Python)
网上的 python3 fp-growth代码每次在执行时可能会出现找出的频繁项集不一致的情况,这是因为每次执行代码时建的FP树可能不一致. 加了一行代码可以解决这个问题(第59行):先对 frequ ...
- Java使用正则表达式匹配多行 Pattern flags
Java中正则匹配有多种模式,若不选择模式则默认为单行匹配 匹配模式(Pattern flags) compile()方法有两个模式 未开匹配模式 Pattern compile(String reg ...