Skip to content

1、取出自身重复的数据

java
@Test
public void test01() {
    List<String> list = Arrays.asList(
        "g", "k", "f", "k", "g", "b"
    );
    List<String> li = list.stream().filter(li1 -> list.stream().filter((li2 -> li2.equals(li1))).count() > 1l)
        .collect(toList());
    System.out.println(li);
}

2、模拟数据

java
//模拟数据库查询出的user集合01
List<User> users01 = Arrays.asList(
    new User(1, "张三", 26, "2018-12-31"),
    new User(2, "李四", 23, "2017-05-06"),
    new User(3, "小安", 23, "2018-01-25"),
    new User(4, "二狗", 26, "1995-09-03"),
    new User(5, "三哈", 23, "1998-11-13"),
    new User(6, "三哈", 27, "1998-11-13")
);

//模拟数据库查询出的user集合02
List<User> users02 = Arrays.asList(
    new User(3, "王五", 15, "1995-05-27"),
    new User(4, "李明", 27, "1949-10-01"),
    new User(5, "小刘", 26, "2019-09-06"),
    new User(6, "小康", 28, "2018-07-31"),
    new User(7, "赵雷", 13, "2015-05-22")
);

3、取出前2个user01s的姓名

java
@Test
public void test02() {
    List<String> nameList = users01.stream().map(User::getName).limit(2).collect(toList());
    System.out.println(nameList);
    Set<String> nameSet = users01.stream().map(User::getName).collect(Collectors.toSet());
    System.out.println(nameSet);
    HashSet<String> nameHash = users01.stream().map(User::getName).collect(Collectors.toCollection(HashSet::new));
    System.out.println(nameHash);
}

4、取出users01中age一样的,并算出有几项

java
@Test
public void test03() {
    List<User> userList = users01.stream().filter(user1 -> users01.stream().filter((user2 -> user2.getAge().equals(user1.getAge()))).count() > 1l)
        .collect(toList());

    userList.stream().forEach((user) -> {
        System.out.println(user.getName() + ":" + user.getAge());
    });
    Map<Object, Object> str = new HashMap<>();
    for (User user : userList) {
        List<User> collect = userList.stream().filter(d -> d.getAge().equals(user.getAge())).collect(toList());
        str.put(user.getAge(), collect.size());
    }
    for (Object key : str.keySet()) {
        String value = str.get(key).toString();//
        System.out.println("key:" + key + " value:" + value);
    }
}

5、取出users01中的Id在users02中没有的user

java
/**
     * allMatch——检查是否匹配所有元素
     * anyMatch——检查是否至少匹配一个元素
     * noneMatch——检查是否没有匹配的元素
     */
//4.取出users01中的Id在users02中没有的user
@Test
public void test04() {
    //取出所有users02的id
    List<Integer> user02Ids = users02.stream().map(User::getId).collect(toList());
    System.out.println(user02Ids);
    List<User> userList = users01.stream().filter(user1 -> !user02Ids.stream().anyMatch(user02Id -> user1.getId().equals(user02Id))).collect(toList());
    userList.stream().forEach((user) -> {
        System.out.println(user.getName() + ":" + user.getAge());
    });



    List<SkuEsModel.Attrs> attrList = baseAttrs.stream().filter(item -> {
        // 过滤掉不包含在 searchAttrIds集合中的元素
        return idSet.contains(item.getAttrId());
    }).collect(Collectors.toList());
}

6、累加users01的所有年龄

java
@Test
public void test05() {
    int sum = users01.stream().mapToInt(User::getAge).sum();
    System.out.println(sum);

    Optional<Integer> op = users01.stream()
        .map(User::getAge)
        .reduce(Integer::sum);
    System.out.println(op.get());
}

7、users01按照birthday排序

java
@Test
public void test06() {

    //根据年龄逆序
    List<User> userList = users01.stream().sorted(Comparator.comparing(User::getBirthday).reversed()).collect(toList());
    userList.stream().forEach((user) -> {
        System.out.println(user.getName() + ":" + user.getAge() + ":" + user.getBirthday());
    });
    System.out.println("--------------------------");
    //根据年龄自然顺序
    List<User> userList1 = userList.stream().sorted(Comparator.comparing(User::getBirthday)).collect(toList());
    userList1.stream().forEach((user) -> {
        System.out.println(user.getName() + ":" + user.getAge() + ":" + user.getBirthday());
    });
}

8、去掉users01name重复的只保留一个

java
@Test
public void test07() {
    List<User> userList = users01.stream().collect(
        Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName()))),
                                     ArrayList::new));
    userList.stream().forEach((user) -> {
        System.out.println(user.getName() + ":" + user.getAge() + ":" + user.getBirthday());
    });
}

9、找到users01中age最小的user

java
/**
     * findFirst——返回第一个元素
     */
@Test
public void test08() {
    //age最大的数
    Optional<Integer> op = users01.stream()
        .map(User::getAge)
        .max(Double::compare);
    System.out.println(op.get());

    //age最小的user
    Optional<User> user = users01.stream()
        .sorted((u1, u2) -> Double.compare(u1.getAge(), u2.getAge())).findFirst();
    System.out.println(user.get().getName());
}

10、找到users01中任意一个age是23的user

java
/**
     * findAny——返回当前流中的任意元素
     */
@Test
public void test09() {
    Optional<User> user = users01.parallelStream()
        .filter((u) -> u.getAge().equals(23))
        .findAny();
    System.out.println(user.get().getName());
}

11、找到users01中age是23的个数

java
@Test
public void test10() {
    long count = users01.stream()
        .filter((u) -> u.getAge().equals(23))
        .count();
    System.out.println(count);
}

12、使用归约统计user的最高、最低、平均、总和age

java
@Test
public void test11() {
    Optional<Integer> max = users01.stream()
        .map(User::getAge)
        .collect(Collectors.maxBy(Integer::compare));
    System.out.println(max.get());

    Optional<User> op = users01.stream()
        .collect(Collectors.minBy((u1, u2) -> Double.compare(u1.getAge(), u2.getAge())));

    System.out.println(op.get().getAge());

    Double avg = users01.stream()
        .collect(Collectors.averagingDouble(User::getAge));

    System.out.println(avg);

    Double sum = users01.stream()
        .collect(Collectors.summingDouble(User::getAge));
    System.out.println(sum);

    Optional<Integer> sum2 = users01.stream()
        .map(User::getAge)
        .collect(Collectors.reducing(Integer::sum));

    System.out.println(sum2.get());

    DoubleSummaryStatistics dss = users01.stream()
        .collect(Collectors.summarizingDouble(User::getAge));

    System.out.println(dss.getMax());
}

13、累加数字

java
@Test
public void test12() {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    Integer sum = list.stream()
        .reduce(0, (x, y) -> x + y);
    System.out.println(sum);
}

14、将Student信息注入到相应的Grade里面的studentList中

java
List<Student> stuList = Arrays.asList(
    new Student(1, "张三", 1),
    new Student(2, "李四", 2),
    new Student(3, "李飞", 2)
);

List<Grade> gradeList = Arrays.asList(
    new Grade(1, "大一"),
    new Grade(2, "大二")
);

//13.将Student信息注入到相应的Grade里面的studentList中
@Test
public void test13() {
    gradeList.stream().forEach((grade) -> {
        List<Student> students = stuList.stream().filter((stu) -> stu.getGradeId().equals(grade.getGradeId())).collect(toList());
        grade.setStudentList(students);
    });
    gradeList.stream().forEach(grade -> {
        System.out.println(grade.getGradeName() + "---");
        grade.getStudentList().stream().forEach(stu -> {
            System.out.println(stu.getStuName());
        });
    });
}

15、字符串数字集合与整数集合互转

java
@Test
public void test14() {
    List<Integer> intList = new ArrayList<>();
    intList.add(1);
    intList.add(3);
    intList.add(4);
    List<String> intToStrList = intList.stream().map(String::valueOf).collect(toList());
    intToStrList.stream().forEach(str -> {
        System.out.println(str);
    });

    List<String> stringList = new ArrayList<>();
    stringList.add("10");
    stringList.add("20");
    stringList.add("30");
    List<String> stringToIntList = stringList.stream().map(String::valueOf).collect(toList());
    stringToIntList.stream().forEach(num -> {
        System.out.println(num);
    });
}

16、取list1与list2的交集

java
List<String> list1 = Arrays.asList(
    "张三", "李四", "李刚", "隋通"
);

List<String> list2 = Arrays.asList(
    "熊大", "熊二", "张三", "李刚"
);

//15.取list1与list2的交集
@Test
public void test15() {
    List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
    System.out.println("---得到交集---");
    intersection.parallelStream().forEach(System.out::println);
}

17、取list1与list2的差集

java
@Test
public void test16() {
    List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
    System.out.println("---得到差集 reduce1 (list1 - list2)---");
    reduce1.parallelStream().forEach(System.out::println);
}

18、取list1与list2的差集

java
@Test
public void test17() {
    List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
    System.out.println("---得到差集 reduce2 (list2 - list1)---");
    reduce2.parallelStream().forEach(System.out::println);
}

19、取list1和list2的并集

java
@Test
public void test18() {
    List<String> listAll = list1.parallelStream().collect(toList());
    List<String> listAll2 = list2.parallelStream().collect(toList());
    listAll.addAll(listAll2);
    System.out.println("---得到并集 listAll---");
    listAll.parallelStream().forEach(System.out::println);
    // 去重并集
    List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
    System.out.println("---得到去重并集 listAllDistinct---");
    listAllDistinct.parallelStream().forEach(System.out::println);
    System.out.println("---原来的List1---");
    list1.parallelStream().forEach(System.out::println);
    System.out.println("---原来的List2---");
    list2.parallelStream().forEach(System.out::println);
}

20、统计集合重复元素出现次数,并且去重返回hashmap

java
List<String> list = Arrays.asList(
    "b", "g", "d", "d", "t", "j", "d", "a", "c", "f", "a", "b", "s", "w", "w", "b"
);

//19.统计集合重复元素出现次数,并且去重返回hashmap
@Test
public void test19() {
    Map<String, Long> map = list.stream().
        collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    System.out.println(map);
    //由于hashmap无序,所以在排序放入LinkedHashMap里(key升序)
    Map<String, Long> sortMap = new LinkedHashMap<>();
    map.entrySet().stream().sorted(Map.Entry.comparingByKey()).
        forEachOrdered(e -> sortMap.put(e.getKey(), e.getValue()));
    System.out.println(sortMap);
    //获取排序后map的key集合
    List<String> keys = new LinkedList<>();
    sortMap.entrySet().stream().forEachOrdered(e -> keys.add(e.getKey()));
    System.out.println(keys);
    //获取排序后map的value集合
    List<Long> values = new LinkedList<>();
    sortMap.entrySet().stream().forEachOrdered(e -> values.add(e.getValue()));
    System.out.println(values);
}

21、模拟模糊查询users01

java
@Test
public void test20(){
    users01.stream().forEach(u->{
        System.out.println(u.getAge());
    });
    System.out.println("----------------------");
    users01 = users01.stream().filter(vo -> {
        return  vo.getName().contains("三")||vo.getBirthday().contains("2018");
    }).collect(toList());
    users01.stream().forEach(u->{
        System.out.println(u.getName()+":"+u.getBirthday());
    });
}

22、stream循环拿到下标

java
@Test
public void test21(){
    Stream.iterate(0, i -> i + 1).limit(users01.size()).forEach(index -> {
        System.out.println(index);
    });
}

23、List集合转Map任意一个属性作为键,键相同的对象用集合存储

java
@Test
public void test22(){
    Map<Integer,List<User>> userMap = new HashMap<>();
    List<User> userList = null;
    for (int i = 0; i < users02.size(); i++) {
        User user = users02.get(i);
        if(userMap.get(user.getAge())==null){
            userList = new ArrayList<>();
        }
        userList.add(user);
        userMap.put(user.getAge(),userList);
    }
    for(Integer key : userMap.keySet()){
        System.out.println("key:"+key+"\n"+"value:"+userMap.get(key));
    }
}

24、List集合转Map任意一个属性作为键,键相同的对象用集合存储(Java8新特性实现)

java
@Test
public void test23(){
    Map<Integer, List<User>> listMap = users02.stream().collect(Collectors.groupingBy(User::getAge));
    listMap.keySet().forEach(key->{
        System.out.println(key);
        listMap.get(key).forEach((user)->System.out.println(user));
    });
    for(Integer key : listMap.keySet()){
        System.out.println("key:"+key+"\n"+"value:"+listMap.get(key));
    }
}