Lambda学习---StreamApi使用

Posted 并不简单

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda学习---StreamApi使用相关的知识,希望对你有一定的参考价值。

package com.zx;

import com.zx.entity.Book;
import org.junit.Test;

import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * StreamApi实战测试类
 *
 * @author ning
 * @create 2018-06-12 9:25
 **/
public class LambdaTest2 {

    @Test
    public void test1(){
        //将get参数解析成map
        String str = "username=zhangsan&age=123&token=et34t423t4&key=f34t435y34&sigature=fsd043f4";
        Map<String, String> collect3 = Stream.of(str.split("&")).map(x -> x.split("=")).collect(Collectors.toMap(a -> a[0], a -> a[1]));
        System.out.println(collect3);
    }

    @Test
    public void test2(){
        //将books的id转换成List<Integer>
        List<Integer> collect = books().stream().map(Book::getId).collect(Collectors.toList());
        System.out.println(collect);
    }
    @Test
    public void test3(){
        //将books的id取出用字符串拼接
        //使用joining,参数必需先转成字符串
        String collect = books().stream().map(x -> x.getId() + "").collect(Collectors.joining(","));
        System.out.println(collect);
        //使用joining,参数必需先转成字符串,还可以加括号
        String collect1 = books().stream().map(x -> x.getId() + "").collect(Collectors.joining(",","(",")"));
        System.out.println(collect1);
        //使用joining,参数必需先转成字符串,还可以加括号,还可以加引号分割
        String collect2 = books().stream().map(x -> "‘" + x.getId() + "‘").collect(Collectors.joining(",","(",")"));
        System.out.println(collect2);
    }
    @Test
    public void test4(){
        //找出所有类型
        List<String> collect = books().stream().map(Book::getType).collect(Collectors.toList());
        System.out.println(collect);
        //去重
        List<String> collect1 = books().stream().map(Book::getType).distinct().collect(Collectors.toList());
        System.out.println(collect1);
        Set<String> collect2 = books().stream().map(Book::getType).collect(Collectors.toSet());
        System.out.println(collect2);
    }

    /**
     *  //排序
     */
    @Test
    public void test5(){

        //1、根据价格
        //Double.compare(b2.getPrice(), b1.getPrice()) 倒序
        List<Book> collect = books().stream().sorted((b1, b2) -> Double.compare(b2.getPrice(), b1.getPrice())).collect(Collectors.toList());
        System.out.println(collect);
        // Double.compare(b1.getPrice(), b2.getPrice()) 正序
        Comparator<Book> comp = (b1, b2) -> Double.compare(b1.getPrice(), b2.getPrice());
        books().stream().sorted(comp).forEach(System.out::println);
        System.out.println("--------------------------------------------------");
        //另一种倒叙,使用Comparator的reversed()方法
        books().stream().sorted(comp.reversed()).forEach(System.out::println);
        System.out.println("--------------------------------------------------");
        //多条件排序
        //先根据价格排序,然后根据出版时间最近的排序
        Comparator<Book> comp2 = (b1, b2) -> b1.getPublishDate().isAfter(b2.getPublishDate()) ? 1 : -1;
        books().stream().sorted(comp.thenComparing(comp2)).forEach(System.out::println);
        System.out.println("--------------------------------------------------");
        books().stream().sorted(Comparator.comparing(Book::getPrice).thenComparing(Comparator.comparing(Book::getPublishDate).reversed())).forEach(System.out::println);
    }

    @Test
    public void test6(){
        //将list集合转换成map,key是id,value是book对象
        Map<Integer, Book> collect = books().stream().collect(Collectors.toMap(Book::getId, b -> b));
        System.out.println(collect);
    }

    /**
     * 统计
     */
    @Test
    public void test7(){
        //找出价格最贵的那本书
        Book book = books().stream().collect(Collectors.maxBy(Comparator.comparing(Book::getPrice))).get();
        System.out.println(book);
        //找出价格最低的那本书
        Book book1 = books().stream().collect(Collectors.minBy(Comparator.comparing(Book::getPrice))).get();
        System.out.println(book1);
        //找出出版日期最近的那本书
        Book book2 = books().stream().collect(Collectors.maxBy(Comparator.comparing(Book::getPublishDate))).get();
        System.out.println(book2);
        //找到最大的价格
        double max = books().stream().collect(Collectors.summarizingDouble(Book::getPrice)).getMax();
        System.out.println(max);
        //找到平均数
        double v = books().stream().collect(Collectors.averagingDouble(Book::getPrice)).doubleValue();
        System.out.println(v);
        //找出价格最贵的那本书,如果不止一本,找到出版日期最近的那本
        Book book3 = books().stream().collect(Collectors.maxBy(Comparator.comparing(Book::getPrice).thenComparing(Comparator.comparing(Book::getPublishDate)))).get();
        System.out.println(book3);
        //找出价格最贵的那本书,如果不止一本,找到出版日期最远的那本
        Book book4 = books().stream().collect(Collectors.maxBy(Comparator.comparing(Book::getPrice).thenComparing(Comparator.comparing(Book::getPublishDate).reversed()))).get();
        System.out.println(book4);
    }

    /**
     * 分组
     */
    @Test
    public void test8(){
        //按照类型分组
        Map<String, List<Book>> collect = books().stream().collect(Collectors.groupingBy(Book::getType));
        collect.keySet().forEach(key -> {
            System.out.println(key);
            System.out.println(collect.get(key));
            System.out.println("----------------------------------------------");
        });
        //统计每种类型有多少本书
        Map<String, Long> collect1 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.counting()));
        System.out.println(collect1);
        System.out.println("----------------------------------------------");
        //单独统计编程语言有多少本
        Long collect2 = books().stream().filter(book -> "编程语言".equals(book.getType())).collect(Collectors.counting());
        System.out.println(collect2);
        //统计每种类型数据的总价格,先分类,再按类型求和
        Map<String, Double> collect3 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.summingDouble(Book::getPrice)));
        System.out.println(collect3);
        //统计每种类型数据,先分类,再求每种类型的平均价格
        Map<String, Double> collect4 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.averagingDouble(Book::getPrice)));
        System.out.println(collect4);
        //统计每种类型数据,先分类,再求每种类型最贵的那本书
        Map<String, Optional<Book>> collect5 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.maxBy(Comparator.comparing(Book::getPrice))));
        System.out.println(collect5);
        System.out.println("----------------------------------------------");
        collect5.keySet().forEach(key -> {
            System.out.println(key);
            System.out.println(collect5.get(key));
            System.out.println("----------------------------------------------");
        });
        //统计每种类型数据,先分类,再求每种类型最便宜的那本书
        Map<String, Optional<Book>> collect6 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.minBy(Comparator.comparing(Book::getPrice))));
        System.out.println(collect6);
        System.out.println("----------------------------------------------");
        collect6.keySet().forEach(key -> {
            System.out.println(key);
            System.out.println(collect6.get(key));
            System.out.println("----------------------------------------------");
        });
        //统计每种类型数据,先分类,再求每种类型最晚出版的那本书
        Map<String, Optional<Book>> collect7 = books().stream().collect(Collectors.groupingBy(Book::getType, Collectors.maxBy(Comparator.comparing(Book::getPublishDate))));
        System.out.println(collect7);
        System.out.println("----------------------------------------------");
        collect7.keySet().forEach(key -> {
            System.out.println(key);
            System.out.println(collect7.get(key));
            System.out.println("----------------------------------------------");
        });
    }

    /**
     * 过滤
     */
    @Test
    public void test9(){
        //过滤加排序
        List<Book> collect = books().stream().filter(book -> book.getPrice() > 60).sorted(Comparator.comparing(Book::getPublishDate).reversed()).collect(Collectors.toList());
        collect.forEach(System.out::println);
    }


    List<Book> books(){
        List<Book> books = new ArrayList<>();
        books.add(new Book(1,"tomcat",50d,"服务器",LocalDate.parse("2016-10-01")));
        books.add(new Book(2,"jetty",54d,"服务器",LocalDate.parse("2015-10-01")));
        books.add(new Book(3,"nginx",54d,"服务器",LocalDate.parse("2014-12-01")));
        books.add(new Book(4,"java",65d,"编程语言",LocalDate.parse("2011-04-01")));
        books.add(new Book(5,"ruby",22d,"编程语言",LocalDate.parse("2016-01-01")));
        books.add(new Book(6,"php",98d,"编程语言",LocalDate.parse("2016-10-25")));
        books.add(new Book(7,"html",90d,"编程语言",LocalDate.parse("2002-10-11")));
        books.add(new Book(8,"oracle",67d,"数据库",LocalDate.parse("2016-10-11")));
        books.add(new Book(9,"mysql",34d,"数据库",LocalDate.parse("2012-10-01")));
        books.add(new Book(10,"ssh",45d,"编程语言",LocalDate.parse("2013-10-01")));
        books.add(new Book(11,"设计模式",56d,"其他",LocalDate.parse("2014-10-01")));
        books.add(new Book(12,"代码重构",87d,"其他",LocalDate.parse("2015-10-01")));
        books.add(new Book(13,"并发编程",34d,"其他",LocalDate.parse("2006-10-01")));
        books.add(new Book(14,"spring源码分析",79d,"其他",LocalDate.parse("2016-05-01")));
        books.add(new Book(15,"大型web项目实战",57d,"其他",LocalDate.parse("2016-10-07")));
        books.add(new Book(16,"php2",98d,"编程语言",LocalDate.parse("2018-10-25")));
        return books;
    }



}

  

以上是关于Lambda学习---StreamApi使用的主要内容,如果未能解决你的问题,请参考以下文章

JDK8

java8新特性

Java8函数式编程

Java8函数式编程

Java8函数式编程

JDK8新特性