java 8 新特性 lambda test

 

package com.wxrem.controller;


import javax.swing.*;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * java 8 新特性 lambda test
 * name	                        type	        description
 * Consumer	                    Consumer< T >	接收T对象,不返回值
 * Predicate	                Predicate< T >	接收T对象并返回boolean
 * Function	                    Function< T, R >	接收T对象,返回R对象
 * Supplier	                    Supplier< T >	提供T对象(例如工厂),不接收值
 * UnaryOperator	            UnaryOperator	接收T对象,返回T对象
 * BinaryOperator	            BinaryOperator	接收两个T对象,返回T对象
 *
 */
public class MyLambdaTest {

    public static void main(String[] args) {
        List<Integer>  list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);

        AnonymousFunctionUse(list);

        funcationTest();



    }
    /*
    java 8 的lambda处理匿名函数
     */
    static void AnonymousFunctionUse(List<Integer> integerList){
        // 转Stream
        Stream<Integer> stringStream = integerList.stream().filter(e ->  e.equals(4) || e.equals(3));

        // java 8 的lambda处理匿名函数
//        stringStream.forEach((sa)-> System.out.println(sa)); //3,4


        // java 8 的 Function函数中的 BinaryOperator<T>
        BinaryOperator<Integer> sum = BinaryOperatorUse();
        System.out.println(stringStream.reduce(sum).get());
        //等同于这里
//        System.out.println(stringStream.reduce(new BinaryOperator<Integer>() {
//            @Override
//            public Integer apply(Integer s, Integer s2) {
//                return s+s2;
//            }
//        }).get());


        //Stream 转为数组1
//        ArrayList<Integer> res1 = (ArrayList<Integer>) stringStream.collect(Collectors.toList());
//        System.out.println(res1);
        //Stream 转为数组2 ,这个可以加多个不同的数组
//        ArrayList<Integer> list2 = new ArrayList<Integer>();
//        list2.add(100);
//        ArrayList<Integer> res = stringStream.collect(() ->
//                        list2,
//                        (list, item) -> list.add(item),
//                        (list, li) -> list.addAll(li));
//        System.out.println(res);

    }
    /**
     *  java 8 的lambda基础语法 expression = (variable) -> action
     *  java Function函数中的 BinaryOperator<T>接口 用于执行lambda表达式并返回一个T类型的返回值
     */
    static BinaryOperator<Integer> BinaryOperatorUse(){
        //自定义函数
        BinaryOperator<Integer> sum = (a, b) -> a+b;
//        System.out.println(sum.apply(3, 4));
        // 自带返回大小方法 maxBy(Comparator<? super T> comparator) 、<T> BinaryOperator<T> minBy(Comparator<? super T> comparator)
        BinaryOperator<Integer> minByTest = BinaryOperator.minBy(Comparator.naturalOrder());
        System.out.println(minByTest.apply(3,4));// 3
        BinaryOperator<Integer> maxByTest = BinaryOperator.maxBy(Comparator.naturalOrder());
        System.out.println(maxByTest.apply(3,4));// 4

        return sum;
    }

    /**
     * Function< T, R >	接收T对象,返回R对象
     */
    static void funcationTest(){
        Function<Integer, Integer> name = e -> e * 2;
        Function<Integer, Integer> square = e -> e * e;
        //返回一个先执行当前函数对象('name.andThen(square)') 的 apply 方法,再执行 after 函数对象 apply 方法的函数对象。
        //先执行外面的,再执行里面的
        int value = name.andThen(square).apply(3);
        System.out.println("andThen value=" + value);

        //返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象
        //先执行里面的,再执行外面的
        int value2 = name.compose(square).apply(3);
        System.out.println("compose value2=" + value2);

        //返回一个执行了apply()方法之后只会返回输入参数的函数对象
        Object identity = Function.identity().apply("huohuo");
        System.out.println(identity);
    }

    /**
     * 断言型接口示例
     */
    static void PredicateTest(){
        Predicate<Integer> predicate = a -> a>10;
        System.out.println(predicate.test(12));
    }

    /**
     * 函数式接口 test
     */
     static void funcationFourTest() {
        donation(1000, money -> System.out.println("好心的麦乐迪为Blade捐赠了"+money+"元")) ;

        List<Integer> list = supply(10,() -> (int)(Math.random()*100));
        list.forEach(System.out::println);

        Integer value = convert("28", x -> Integer.parseInt(x));

        List<String> fruit = Arrays.asList("香蕉", "哈密瓜", "榴莲", "火龙果", "水蜜桃");
        List<String> newFruit = filter(fruit, (f) -> f.length() == 2);
        System.out.println(newFruit);
    }
    //消费型接口示例
    public static void donation(Integer money, Consumer<Integer> consumer){
        consumer.accept(money);
    }

    //供给型接口示例
    public static List<Integer> supply(Integer num, Supplier<Integer> supplier){
        List<Integer> resultList = new ArrayList<Integer>()   ;
        for(int x=0;x<num;x++)
            resultList.add(supplier.get());
        return resultList ;
    }
    //函数型接口示例: 转换字符串为Integer
    public static Integer convert(String str, Function<String, Integer> function) {
        return function.apply(str);
    }
    //断言型接口示例 筛选出只有2个字的水果
    public static List<String> filter(List<String> fruit, Predicate<String> predicate){
        List<String> f = new ArrayList<>();
        for (String s : fruit) {
            if(predicate.test(s)){
                f.add(s);
            }
        }
        return f;
    }

}

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页