高效 告别996,开启java高效编程之门 2-15方法引用精讲

2-14课程和2-12重复了,所以没有发出来

1  方法引用使用条件

判断方法引用 是否满足场景的要求的时候,只需要看我们的出参和入参是否满足接口的要求即可


2  方法引用场景

四种方法引用类型:

指向静态方法         Class::staticMethod指向现有对象的实例方法    object::instanceMethod指向任意类型的实例方法    C1ass::instanceMethod指向构造方法         Class::new
3  方法引用demo
package com.imooc.zhangxiaoxi.lambda;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * MethodReferenceTest
 *
 * 判断方法引用 是否满足场景的要求的时候,只需要看我们的出参和入参是否满足接口的要求即可
 *
 * @author 魏豆豆
 * @date 2020/4/6
 */
public class MethodReferenceTest {

    static class Sku{
        private String skuName;
        private Integer skuPrice;

        public Integer getSkuPrice() {
            return skuPrice;
        }

        /**
         * 静态类方法引用
         * @param sku1
         * @param sku2
         * @return
         */
        public static int staUse(Sku sku1,Sku sku2){
            return sku1.getSkuPrice()-sku2.getSkuPrice();
        }

        public int instanceComparePrice(Sku sku){
            return this.getSkuPrice() - sku.getSkuPrice();
        }
    }

    class PriceComparator{
        public int staUse2(Sku sku1,Sku sku2){
            return  sku1.getSkuPrice()-sku2.getSkuPrice();
        }
    }

    /**
     * sort接收compare接口,里面方法 为compare方法,接收两个同种类型的参数
     *
     * 而案例中,
     * 1    两个参数(sku1,sku2)同种类型
     * 2    他们的单价相减 返回int类型
     * 所以它们可以作为sort的lambda来使用
     */
    public void test(){
        List<Sku> skuList = new ArrayList<Sku>();
        skuList.sort((sku1,sku2)->
                sku1.getSkuPrice()-sku2.getSkuPrice());

        //1 类名::方法名
        skuList.sort(Sku::staUse);
        //1 展开
        skuList.sort((Sku sku1,Sku sku2)->{
            return Sku.staUse(sku1,sku2);
        });

        //2 对象::实例方法名
        PriceComparator priceComparator = new PriceComparator();
        skuList.sort(priceComparator::staUse2);
        //2 展开
        skuList.sort((Sku sku1,Sku sku2)->{
            return priceComparator.staUse2(sku1, sku2);
        });

        //3 类名::实例方法名
        skuList.sort(Sku::instanceComparePrice);
        //3 展开
        skuList.sort((Sku object,Sku sku2)->{
                    return object.instanceComparePrice(sku2);
                }
        );

        //4 指向构造方法的引用     // skuList 为null 返回空,
        Optional.ofNullable(skuList).orElseGet(ArrayList::new);

     }

}

 

原文地址:https://www.cnblogs.com/1446358788-qq/p/12640970.html

时间: 2024-11-07 14:31:17

高效 告别996,开启java高效编程之门 2-15方法引用精讲的相关文章

java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

 java多线程创建方法http://blog.csdn.net/cjc211322/article/details/24999163  java创建多线程方法之间的区别http://blog.csdn.net/cjc211322/article/details/25000449 java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

Upgrading to Java 8——第二章 Method References(方法引用)

概述 很多java 方法 会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: public static T[] sort(T[] array, Comparator<? super T> comparator) 相对于传递一个Compartor的实例给sort方法,不如传递一个Lambda表达式. 进一步,我们可以传递一个方法引用来代替Lambda表达式,一个简单的方法引用

高效 告别996,开启java高效编程之门 3-2传统方式处理业务逻辑

1 重点 1.1 对sort方法使用的理解 2 代码演练 需求: 根据第一章需求,女盆友提出需求* 1 打印所有商品* 2 图书类的商品一定给买* 3 最贵的买两件* 4 打印最贵的两件商品的名称和总价 测试类: package com.imooc.zhangxiaoxi.stream; import com.alibaba.fastjson.JSON; import com.imooc.zhangxiaoxi.lambda.cart.CartService; import com.imooc.

高效 告别996,开启java高效编程之门 3-7实战:常用中间操作演示之:过滤/映射/扁平化 filter/map/flagMap

1 重点 filter方法的使用 map方法的使用 flatMap方法的使用 forEach方法的使用 2 map和flatMap的区别: map的作用很容易理解就是对rdd之中的元素进行逐一进行函数操作映射为另外一个rdd. flatMap的操作是将函数应用于rdd之中的每一个元素,将返回的迭代器的所有内容构成新的rdd.通常用来切分单词,可用来单词计数 3 实战演示之过滤(filter): package com.imooc.zhangxiaoxi.stream; import com.al

高效 告别996,开启java高效编程之门 2-8实战:判断逻辑参数化-Lambda表达式

0 有用部分 1    函数式编程简介 2    函数式编程和lambda的关系 3    lambda表达式应用范围 4    lambda应用的五个案例 5    函数式编程应用条件 6 提出问题 0 有用部分 4 lambda应用的五个案例 5 函数式编程应用条件 6 提出问题 本节主要介绍了lambda的使用方式,具体demo参照2-10 和2-15 1 函数式编程简介 函数式编程是一种不同的编程思想,定义函数作为公民,可以赋值给变量,作为参数或者返回值来传递 2 函数式编程和lambd

高效 告别996,开启java高效编程之门 2-10实战:自定义函数式接口

1 有用部分 2    代码演练 1 有用部分 个人理解: 1.1 关于lambda的应用 通过 @FunctionalInterface注解 将其参数 fileContent  注入,调用的时候可以直接调取到. 服务层通过直接调用接口的方法,没有用实现类 1.2 关于文件流的读取操作 demo中设计更多的流的读取的操作 2 代码演练 需求: 将本地文件打印出来 接口: package com.imooc.zhangxiaoxi.lambda.file; /** * 接口中只有一个抽象方法,可以

高效 告别996,开启java高效编程之门 3-6流操作分类

1 重点 理解流程操作分类 常用的方法 2 Stream流操作分类: 2.1 流操作分类之中间操作(Intermediate): 无状态操作——filter/map/peek等有状态操作——dictinct/sorted/limit等 2.2 流操作分类之终端操作(Termina1):非短路操作——forEach/collect/count等短路操作——anyMatch/findFirst/findAny等 2.3 有状态操作无状态操作区别: 无状态操作: 比如map或者filter会从输入流中

高效 告别996,开启java高效编程之门 3-5 Stream流概念解析

3-4讲的没有意义,直接过了 1 重点 概念解析中的定义 Stream流的组成 Stream流和集合的区别 2 概念解析 定义: 从支持数据处理操作的源生成的元素序列. 解释: 元素序列:和集合一样,流也是一个接口,可以访问特定元素类型的一组有序值,有序值就是元素序列 源:为流提供数据的源头,比如集合,数组,都可以称之为源. 数据处理操作:流的数据处理操作支持类似与数据库的操作(map,sort,limit)以及函数式编程语言中的一些常用操作. 功能: ◆JDK1.8引入的新成员,以声明式方式处

java:编程比赛中有用的方法整理(一)数组

我曾经参加过几次编程比赛,但是当时用的是c语言,现在学习了java,打算专攻java组,故以此整理. 数组无论在哪里都必不可少. 一.数组的拷贝: 使用Arrays类的copyOf方法: 1.将一个数组中的所有值拷贝到另一个里面: int[] copiedLuckyNumber=Arrays.copyOf(luckyNumbers,luckyNumbers.length); 2.数组的扩容: luckyNumbers=Arrays.copyOf(luckyNumbers,2*luckyNumbe