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表达式,好 ...
随机推荐
- git blame (10)
git blame system_server.c 每一行提交的sha ,作者,提交的日期及提交的信息
- redis缓存, 缓存击穿,缓存雪崩,缓存穿透
在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库:即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到磁盘IO操作(MySQL也有一些数据预读技术, ...
- K8s中的网络
Kubernetes的网络通信问题: 1. 容器间通信: 即同一个Pod内多个容器间通信,通常使用loopback来实现. 2. Pod间通信: K8s要求,Pod和Pod之间通信必须使用Pod-IP ...
- redis 下key的过期时间详解 :expire
memcached 和 redis 的set命令都有expire参数,可以设置key的过期时间.但是redis是一个可以对数据持久化的key-value database,它的key过期策略还是和me ...
- Linux内核宏DEVICE_ATTR使用
1.前言 在Linux驱动程序编写中,使用DEVICE_ATTR宏,可以定义一个struct device_attribute设备属性,并使用sysfs的API函数,便可以在设备目录下创建出属性文件, ...
- wraps补充
''' wraps: (了解) 是一个修复工具,修复的是被装饰对象的空间. from functools import wraps ''' from functools import wraps de ...
- angular get 数据请求
数据请求 get 新建一个服务 1. ng g service services /+服务名 eg:ng g service services/player 在此服务中进行设置 引入自带组件以及注册 ...
- python抓取每期双色球中奖号码,用于分析
获取每期双色球中奖号码,便于观察,话不多说,代码如下 # -*- coding:utf-8 -*- # __author__ :kusy # __content__:获取每期双色球中奖号码 # __d ...
- 由一个问题引起的思考:WEB开发中,使用JSON-RPC好,还是RESTful API好?
起因: 研究zabbix的API设计风格.查看zabbix官网API文档,可以看到使用的是json-rpc:2.0 随后搜索到知乎上的一个问题讨论:https://www.zhihu.com/ques ...
- 宝塔webhook配合码云,本地git push 服务器自动pull
emmmm,这其实是一个很简单的一件事情,但是有很多坑,记录一下 先大概讲一下原理吧,就是每次您 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求 更多说明 » 然后在宝塔这边 ...