java8 类静态方法引用之 普通方法如何过渡到lamdba表达式的

1.先看一个java8的代码

 /**
     * 利用function将list集合中的每一个元素转换后形成新的集合返回
     *
     * @param list     要转换的源集合
     * @param function 转换元素的方式
     * @param       源集合的元素类型
     * @param       转换后的元素类型
     * @return
     */
    public static <T, R> List<R> convert(List<T> list, Function<T, R> function) {
        List<R> result = new ArrayList<>();
        list.forEach(t -> result.add(function.apply(t)));
        return result;
    }

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1000, 2000, 3000);
        List<String> newList = CollectionUtil.test5(list, Integer::toHexString);
        System.out.println(newList);
    }

java8 类静态方法引用之 普通方法如何过渡到lamdba表达式的_第1张图片


此时,一脸懵逼。现在想一下我们之前实现这个功能怎么写的呢 ?

test1方法

  private static void tes1(List<Integer> list) {
        List<String> converts = new ArrayList<>();
        for (Integer item : list) {
            String hexString = Integer.toHexString(item);
            converts.add(hexString);
        }
    }

可以看出来
Integer.toHexString(item); 这个方法是写死的,如果做别的处理的话,需要重新写,所以,需要改下,看test2方法

test2方法

  private static <T, R> void tes2(List<T> list, Function<T, R> function) {
        List<R> converts = new ArrayList<>();
        for (T item : list) {
            R hexString = function.apply(item);
            converts.add(hexString);
        }
    }

test3方法 简化代码

 private static <T, R> void tes3(List<T> list, Function<T, R> function) {
        List<R> converts = new ArrayList<>();
        for (T item : list) {
            converts.add(function.apply(item));
        }
    }

test4方法 for循环改写成jdk8的

  private static <T, R> void tes4(List<T> list, Function<T, R> function) {
        List<R> converts = new ArrayList<>();
        list.forEach(i -> converts.add(function.apply(i)));

    }

test5 添加返回值

    private static <T, R> List<R> test5(List<T> list, Function<T, R> function) {
        List<R> result = new ArrayList<>();
        list.forEach(i -> result.add(function.apply(i)));
        return result;
    }

到此,test5演变成了 conver的方法了。但是

main

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1000, 2000, 3000);
        List<String> newList = CollectionUtil.test5(list, Integer::toHexString);
        System.out.println(newList);
    }

其中 List newList = CollectionUtil.test5(list, Integer::toHexString);这个是什么鬼?
其实,main可以这样写:

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1000, 2000, 3000);
        List<String> convert = CollectionUtil.test5(list, i -> Integer.toHexString(i));
        //上面的Lambda表达式代码块中,只有对Integer.toHexString()方法的引用,没有其它代码
        // ,因此我们可以直接把方法作为参数传递,由编译器帮我们处理,这就是静态方法引用:
         List<String> newList = CollectionUtil.test5(list, Integer::toHexString);
        System.out.println(newList);

    }

这里,演变就ok了!!

你可能感兴趣的:(java8,java基础)