常用函数接口:

函数式接口:

函数式接口在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新特性。的更多相关文章

  1. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  2. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  3. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

  4. Java8 新特性之Stream----java.util.stream

    这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  7. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  8. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  9. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

  10. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

随机推荐

  1. LOJ6115 汇合 树上分块

    本题空间很小,那些O(nlogn)的树上lca算法在这里不顶用了,可以考虑树分块. 本题的树分块是基于深度的,即按深度每\(\sqrt n\)分一块,然后一块一块往上跳,一直跳到lca处. 对于这题, ...

  2. WebBrowser内存泄露

    使用WebBrowser控件开发的程序,占用内存会随着时间不停增长,最终内存溢出导致崩溃.究其原因是由于其自身的缺陷造成的.每一次加载新页面,WebBrowser就会多占用10-20M内存,有资料说是 ...

  3. 【06月05日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年06月05日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年06月05日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  4. python中进程、线程、协程简述

    进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...

  5. Maven 教程(5)— Maven目录结构及常用命令说明

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79543159 1.Maven目录结构说明 Maven总体目录结构如下图: bin ...

  6. 从有序矩阵M x N中找出是否包含某一个数,要求时间复杂度为O(M+N)

    有序指的是每行从左到右依次变大,每列从上到下依次变大 思路: 从右上顶点开始依次判断当前值与给定值的大小,往左下顶点移动,结束条件是下标超过范围 public class FindNumInOrder ...

  7. 【题解】整数划分 [51nod1201] 整数划分 V2 [51nod1259]

    [题解]整数划分 [51nod1201] 整数划分 V2 [51nod1259] 传送门:整数划分 \([51nod1201]\) 整数划分 \(V2\) \([51nod1259]\)** [题目描 ...

  8. 『金字塔 区间dp』

    金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...

  9. Java学习:JDBC各类详解

    JDBC各个类详解 代码实现: //1.导入驱动jar包 //2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //3.获取数据库连对象 ...

  10. SQL系列(七)—— 相似(like)

    在看like之前先了解下通配符和搜索模式: 通 配 符 ( wildcard) 用来匹配值的一部分的特殊字符. 搜索模式(search pattern) 由字面值.通配符或两者组合构成的搜索条件. 目 ...