Java8新特性--函数式编程
在jdk8中什么是函数式接口: 
1、被@FunctionalInterface注解修饰的。 
2、接口里边只有一个非default的方法。 
满足以上2个条件的即为函数式接口,ps:即使一个接口没有被@FunctionalInterface修饰,但是满足2,那么这样的接口也会是函数式接口。 
Supplier 
概要:不接受参数,返回一个值。 
jdk源码:
 */
@FunctionalInterface
public interface Supplier<T> {
    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}即:Supplier不接受参数,返回一个值。
example:
public class SupplierTest {
    public static void main(String[] args) {
        Supplier<Student> supplier = Student::new;//这里使用了方法引用(后续解释)生成了一个对象。
        System.out.println(supplier.get().getName());
    }
}Function 
概要:接受一个参数返回一个值 
jdk源码:
//类型T入参,类型R是返回值的类型
@FunctionalInterface
public interface Function<T, R> {
    /**
        接受一个参数,返回一个结果
     */
    R apply(T t);
    /**
     * 默认方法是讲的课8新加入的一种类型,入参before是一个Function(接受参数V类型,输出T类型),从实现来看其首先调用before的行为得到输出T,
     * 随后T作为当前Function的入参,最后当前Function输入R类型。即:compose函数传入的函数首先被调用,得到的结果作为当前Function的入参使用
     */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    /**
     * andThen是和compose相反的操作,当前Function首先被调用,得到的结果作为参数after的入参,调用after。
     */
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
    /**
     * 对接受的元素,不做处理
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }
}BiFunction 
概要:接受2个参数,返回一个值。 
jdk源码:
//T和U类型是参数,R类型是返回值。
@FunctionalInterface
public interface BiFunction<T, U, R> {
    /**
     * BiFunction的主方法,接受2个参数,返回一个结果
     */
    R apply(T t, U u);
    /**
     * 先执行当前BiFunction的行为,得到结果R类型,R类型最后作为Function的实例after的入参(泛型“? super R”即“?”是R类型或者是R类型的
     * 父级)返回V类型的结果。PS:考虑为什么andThen的入参是一个Function,而不是一个BiFunction?
     */
    default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t, U u) -> after.apply(apply(t, u));
    }
}example:
/**
 * Created by CeaserWang on 2017/1/8.
 */
public class FunctionATest {
    public static void main(String[] args) {
        FunctionATest functionTestA = new FunctionATest();
       // functionTestA.testfunction1();
        System.out.println(functionTestA.computeA(3,value -> value = value * 3,value -> value+1));
        System.out.println(functionTestA.computeB(3,value -> value = value * 3,value -> value+1));
        System.out.println(functionTestA.computeC(3,4,(value1,value2) -> {return value1+value2;},value -> value*value));
    }
    public void testfunction1(){
        List<String> list = Arrays.asList("zhangsan","lisi","wangwu");
         Collections.sort(list,(o1,o2) -> {return o1.compareTo(o2); });
        Collections.sort(list,(o1,o2) ->  o1.compareTo(o2));
        list.forEach((item) -> System.out.println(item));
         list.forEach(String::toUpperCase);
         list.stream().map(String::toUpperCase).forEach(item -> System.out.println(item));
    }
    public int  computeA(int a, Function<Integer,Integer> function,Function<Integer,Integer> befor ){
        return  function.compose(befor).apply(a);
    }
    public int  computeB(int a, Function<Integer,Integer> function,Function<Integer,Integer> after ){
        return  function.andThen(after).apply(a);
    }
    public int  computeC(int a,int b, BiFunction<Integer, Integer,Integer> bifunction, Function<Integer,Integer> function ){
        return  bifunction.andThen(function).apply(a,b);
    }
}BinaryOperator 
概要:继承了BiFunction新加了2个求最大值和最小值的方法。 
jdk源码:
//继承了BiFunction,入参和返回值都是同一种类型T,因为2中相同类型的元素做大小比较,返回的是其中一个,即还是原来入参的类型。
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
    /**
     * 根据比较器comparator求最小值
     */
    public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
        Objects.requireNonNull(comparator);
        return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
    }
    /**
     * 根据比较器comparator求最大值
     */
    public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
        Objects.requireNonNull(comparator);
        return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
    }
}example:
/**
 * Created by Administrator on 2017/1/8.
 */
public class BinaryOperatorTest {
    public static void main(String[] args) {
        BinaryOperatorTest  BinaryOperatorTest = new BinaryOperatorTest();
        Integer rnum =   BinaryOperatorTest.compute(2,3,(num1,num2) -> {return num1 * num2;},value -> 2*value);
        System.out.println(rnum);
        System.out.println("-------------------------------------");
        Integer rnum2 =   BinaryOperatorTest.compute(2,3,(num1,num2) -> {return num1 * num2;});
        System.out.println(rnum2);
        System.out.println("-------------------------------------");
        Integer rnum3 =   BinaryOperatorTest.computeA(2,3,(num1,num2) ->   num1.compareTo(num2));
        System.out.println(rnum3);
    }
    public Integer compute(Integer a, Integer b, BinaryOperator<Integer> binaryoperator, Function<Integer,Integer> function) {
        return binaryoperator.andThen(function).apply(a,b);
    }
    public Integer compute(Integer a, Integer b, BinaryOperator<Integer> binaryoperator) {
        return binaryoperator.apply(a,b);
    }
    public Integer computeA(Integer a, Integer b, Comparator<Integer> comparator){
        return BinaryOperator.minBy(comparator).apply(a,b);
    }
}Predicate 
概要:接受一个参数返回boolean类型,常用语filter过滤条件使用。 
jdk源码:
@FunctionalInterface
public interface Predicate<T> {
    /**
     * 接受一个参数返回一个boolean值
     */
    boolean test(T t);
    /**
     *与操作,支持短路与
     */
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
    /**
     * 取反操作
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    /**
     * 或操作,支持短路或
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    /**
     * 比较2个对象是否相同
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}example:
/**
 * Created by CeaserWang on 2017/1/8.
 */
public class PredicateTest {
    public static void main(String[] args) {
        Predicate<String> mypredicate = value -> value.length()>5;
        System.out.println(mypredicate.test("hello55s"));
        List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7,8,9);
        PredicateTest predicatetest = new PredicateTest();
        predicatetest.condationA(nums,value -> value>5);
        System.out.println("\n---------------------------");
        predicatetest.condationA(nums,value -> value % 2 ==0);
        System.out.println("\n---------------------------");
        System.out.println(predicatetest.condationEqual("test").test("test"));
    }
    public void condationA(List<Integer> list, Predicate<Integer> predate){
        for(Integer item : list){
            if(predate.test(item)){
                System.out.print(item);
            }
        }
    }
    public Predicate<String> condationEqual(Object obj){
        return Predicate.isEqual(obj) ;
    }
}Optional 
概要:jdk8为了解决NPE问题提供的解决方案。 
在jdk7中业务中很多代码都是这样:
if(null!=XXX){
    doSomeThing();
}开发人员需要警惕NPE问题,给开发带来了一些不便,现在我们不想用这三行固定的语句,为此jdk8有了Optional。 
Optional内部维护了一个value的成员变量,为此Optional提供了诸多针对于此成员变量的方法。 
Optional中的其中一个方法:
    //空对象
    private static final Optional<?> EMPTY = new Optional<>();
    //Optional维护的值
     private final T value;
    //是否是空值
    public boolean isPresent() {
        return value != null;
    }
    //如果不是空值,那么执行针对于value的行为。
        public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
    //构造一个值为value的Optional对象,value不能为空,否则报错。
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    //返回一个空值
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    //创建一个允许空值的Optional对象
       public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }example:
/**
 * Created by CeaserWang on 2017/1/8.
 * optional 不要作为成员变量或者参数,optional只是为了应对null异常而来的
 */
public class OptionalTest {
    public static void main(String[] args) {
        OptionalTest OptionalTest = new OptionalTest();
        OptionalTest.optionalA();
        OptionalTest.optionalB();
    }
    public void optionalA(){
        //Optional optional = Optional.of("hello");
        Optional optional = Optional.ofNullable(null);//创建一个空的对象
        optional.ifPresent(item -> System.out.println(item));//如果为空此行代码不会报错。
        System.out.println(optional.orElse("world"));//如果为空输出word
        System.out.println(optional.orElseGet(() -> "opop"));//如果为空,取Supplier提供的值
    }
    public void optionalB(){
        Company company = new Company();
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        company.setEmployyee(Arrays.asList(e1,e2));
        Optional<Company> optional = Optional.ofNullable(company);
        System.out.println(optional.map(icompany -> icompany.getEmployyee()).orElse(Collections.emptyList()));
    }
}函数式编程和以往的面向对象的方式有一定的区别,函数式编程方法的参数可以传递行为,这些行为包括但不限于以上介绍的这些,jdk8提供的函数式编程的辅助类在java.util.function包下边: 
这些针对于函数式编程的辅助类,对以后的收集器,流是基础,后续的jdk新加的框架都是使用这些基类展开的。
Java8新特性--函数式编程的更多相关文章
- Java8 新特性 —— 函数式编程
		本文部分摘录自 On Java 8 概述 通常,传递给方法的数据不同,结果也不同.同样的,如果我们希望方法被调用时的行为不同,该怎么做呢?结论是:只要能将代码传递给方法,那么就可以控制方法的行为. 说 ... 
- Java8 新特性----函数式接口,以及和Lambda表达式的关系
		这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ... 
- Java8 新特性 函数式接口
		什么是函数式接口 函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了. 函数式接口的 ... 
- java8新特性-函数式接口详细讲解及案例
		一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ... 
- java8新特性学习:函数式接口
		本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ... 
- 乐字节-Java8新特性之方法引用
		上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ... 
- Java8 新特性 Lamdba表达式
		Lamdba 表达式为什么出现 Java8是自java延生以来最大的改变,他允许java中的方法和函数成为一等公民(可以在方法间传递),所以就应运而出现了Lamdba表达式,他可以将表达式传递给另 ... 
- [译]java8新特性:函数式编程(functional programming)的优点
		Java8引入了函数式编程,他对java是一个极大的扩展.Java从此不在是一个单纯的面向对象语言,现在他同时混合了函数式编程.这是巨大的改变,需要我们调整面对对象的编程习惯,以适应这些变化. 但是为 ... 
- 乐字节-Java8新特性之函数式接口
		上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ... 
随机推荐
- MFC无法使用CDialogEx类
			在stdafx.h中添加以下代码: #include <afxcontrolbars.h> 
- 生命不息,奔跑不止,持之以恒,勇攀高峰——JasonCeng的跑步打卡
			生命不息,奔跑不止,持之以恒,勇攀高峰!JasonCeng的跑步打卡博文,持续更新,培养好习惯,一起变成更优秀的自己! 2019-12-20-5.05km Avg-speed(均速): 5'56'' ... 
- 学习Ajax小结
			Ajax 学习 1.ajax的概念 局部刷新技术,不是一门新技术,是多种技术的组合,是浏览器端技术 2.作用 可以实现 ... 
- [转帖]深度分析HBase架构
			深度分析HBase架构 https://zhuanlan.zhihu.com/p/30414252 原文链接(https://mapr.com/blog/in-depth-look-hbase-a ... 
- c++实现双端队列
			在使用c++容器的时候其底层如何实现 例如 vector 容器 :是一个内存可以二倍扩容的向量容器,使用方便但是对内存要求严格,弊端明显 list 容器 : 双向循环链表 deq ... 
- 怎样在python中写多行语句
			一般来说, 一行就是一条语句, 但有时语句过长不利于阅读, 一般会写成多行的形式, 这时需要在换行时使用反斜杠: \ name = "Lilei" age = 23 gender ... 
- .NET Standards
			.net的创始者们在一开始的时候,就意识到了他们的编程技术可以用在不通的操作系统和不同类型的cpu上.他们改进了20世纪90年代编程语言实现技术.最主要的一条是,不同的编程语言对应统一个运行时,及CL ... 
- vue  百度云上传文件PostObject
			百度云上传文件 API(PostObject) PostObject接口 : 接口描述 此接口使用HTML表单上传文件到指定bucket,用于实现通过浏览器上传文件到bucket.在PutObjec ... 
- 转 winfrom组件圆角
			using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ... 
- element   table中使用el-select
			效果: 然后看代码: 注意事项: el-select的v-model要和option的value值对应,注意是string还是number类型哦- 此文转载别人 
