• 常用的Lambda表达式


       Java 8 引入Lambda表达式,对于Java开发人员来说是一大福利,简化了代码,提高了开发效率。

      本文主要讲解日常开发中使用频率比较高的几类Lambda表达式。

    集合

      Lambda表达式的引入,大大的方便了我们的集合操作,使得Map,list之间的转换变得简单了。

    List<T> ---> map<S,List<T>>

    Map<String, List<Entity>> demoMap = demoList.stream().collect(Collectors.groupingBy(Entity::getkey));

    List<T> ---> map<S,T>

    /**
    * toMap 如果集合对象有重复的key,会报Duplicate key...错, * 可以用 (k1,k2)->k1来设置,如果有重复的key,则保留key1,舍弃key2 */ Map<String,Entity> map = stats.stream().collect(Collectors.toMap(Entity::getKey,c -> c,(k1,k2)->k1))); Map<String,String> map = stats.stream().collect(Collectors.toMap(Entity::getKey,Entity::getStringValue));

    map<S,List<T>> ---->List<T>

    List<Entity> demoList = dataMap.entrySet().stream().flatMap(map -> map.getValue().stream()).collect(Collectors.toList());

    线程

    普通开启异步线程

    new Thread(() -> System.out.println("Thread Starting......")).start();

    线程池开启异步线程(不接收返回参数)

    public static ExecutorService executor = Executors.newFixedThreadPool(10);
    executor.submit(() -> aiCollectionFacade.initAiCollection(dto));

    线程池开启异步线程(接收返回参数)

    public static ExecutorService executor = Executors.newFixedThreadPool(10);
    Future<?> result = executor.submit(() -> sum(a, b));
    System.out.println(result.get());

    Stream类

    创建Stream的方法

       使用range方法给定一个范围来创建一个基本类型的流。 

    IntStream intStream = IntStream.range(1,100); 

      直接给值来创建流 

    Stream stream = Stream.of(“hanjt”,”is”,”the”,”most”,”dashing”); 

      由数组创建流 

    IntStream stream2 = Arrays.stream(numbers2); 

      由文件生成流 

    try { 
        Stream lines = Files.lines(Paths.get(“data.txt”),Charset.defaultCharset()); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 

      由函数生成流 

    迭代:Stream.iterate(0, n -> n + 2).limit(10) .forEach(System.out::println); 
    生成:Stream.generate(Math::random).limit(5) .forEach(System.out::println);

    Stream相关的Lambda表达式

    属性过滤

    List vegetarian = menu.stream().filter(Dish::isVegetarian) .collect(Collectors.toList()); 

    条件过滤

    List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); 
    numbers.stream().filter(i -> i % 2 ==0).distinct().forEach(System.out::println); 

    截断

    List dishes = menu.stream().filter(d -> d.getCalories() >300).limit(3) .collect(toList()); 

    跳过元素 

    List dishes = menu.stream().filter(d -> d.getCalories() >300).skip(2) .collect(toList()); 

    映射 

    List dishNames =menu.stream().map(Dish::getName).collect(toList());
    List words = Arrays.asList(“Java8”, “Lambdas”, “In”, “Action”); 
    List wordLengths = words.stream().map(String::length) .collect(toList()); 

    展开

    List uniqueCharacters = words.stream().map(w -> w.split(“”)) .flatMap(Arrays::stream).distinct().collect(Collectors.toList());

    任意匹配 

    if(menu.stream().anyMatch(Dish::isVegetarian)){ 
      System.out.println(“The menu is (somewhat) vegetarian friendly!!”); 
    } 

    全部匹配 

    boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); 

    全部不匹配 

    boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000); 

    获取任意元素 

    Optional dish =menu.stream() .filter(Dish::isVegetarian).findAny(); 归约 

    计算

    int sum2 = numbers.stream().reduce(0, (a,b) -> a + b); 
    int sum3 = menu.stream().map(Dish::getColories).reduce(0, Integer::sum); 
    //如果已知数据类型,可用下面方法。
    //但仅支持int doule.long
    int sum4 = people.stream().mapToInt(p -> p.getAge()).sum();

    求最值 

    Optional max = numbers.stream().reduce(Integer::max); 
    Optional min = numbers.stream().reduce(Integer::min);
  • 相关阅读:
    命令行查看memcached的运行状态(转载)
    有类与无类路由下的路由匹配原则(转载)
    数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)
    还是畅通工程(HDU 1233)
    还是畅通工程(HDU 1233)
    Financial Management(SDUT 1007)
    Financial Management(SDUT 1007)
    二分图的最大匹配、完美匹配和匈牙利算法
    二分图的最大匹配、完美匹配和匈牙利算法
    求二叉树的层次遍历(SDUT 2824)
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9778195.html
Copyright © 2020-2023  润新知