加载中...

AliveSevenの博客

Java中list的stream流详解

发表于: 2023-05-21 |

更新于: 2023-05-21 |

字数统计: 4478 |

阅读量: 0

  1. Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作
  2. 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

基本使用

  • Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象
  • 比如
java 复制代码
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

获取流的方法

  1. 根据List集合获取流
java 复制代码
        // 创建List集合
        List<String> list = new ArrayList<>();
        list.add("一号");
        list.add("二号");
        list.add("三号");
        Stream<String> stream1 = list.stream();
  1. 根据Set集合获取流
java 复制代码
		Stream<String> stream2 = set.stream();
  1. 根据Map集合获取流
java 复制代码
        // 创建Map集合
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"一号");
        map.put(2,"二号");
        map.put(3,"三号");
 
        // 根据Map集合的键获取流
        Set<Integer> map1 = map.keySet();
        Stream<Integer> stream3 = map1.stream();
        // 根据Map集合的值获取流
        Collection<String> map2 = map.values();
        Stream<String> stream4 = map2.stream();
        // 根据Map集合的键值对对象获取瑞
        Set<Map.Entry<Integer, String>> map3 = map.entrySet();
        Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
  1. 根据数组获取流
复制代码
        // 根据数组获取流
        String[] arr = {"一号","二号","三号"};
        Stream<String> stream6 = Stream.of(arr);

Stream流的常用方法

.collect(Collectors.toList())

  • 使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合
  • 使用filter()函数之后也可以通过该方法得到集合。
  • Collectors.toList() 用来结束Stream流

stream().filter()

stream().filter()一般适用于list集合,主要作用就是条件查询,从集合中查询想要的数据。filter里面的参数user是指集合里面的每一项

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        //创建3个对象
        User u1 = new User();
        u1.setAge(23);
        u1.setName("xiaoming");
        u1.setId(123456);

        User u2 = new User();
        u2.setAge(26);
        u2.setName("xiaofang");
        u2.setId(77777);

        User u3 = new User();
        u3.setAge(18);
        u3.setName("honghong");
        u3.setId(11111);
        //添加对象到集合
        list.add(u1);
        list.add(u2);
        list.add(u3);
        //条件筛选
        compare(list);

    }

    private static void compare(List<User> list) {
        //在集合中查询用户名为xiaofang的集合
        List<User> userList = list.stream().filter(user -> "xiaofang"           .equals(user.getName())).collect(Collectors.toList());
        
        System.out.println(list);
        System.out.println(userList);
        
        List<User> userList1 = list.stream().filter(user -> user.getAge() > 19 && user.getAge() < 24).collect(Collectors.toList());
        System.out.println(userList1);
    }
}

filter:筛选(里面输入的筛选的条件( user -> “xiaofang”.equals(user.getName()) )),这里的条件是查询uesr对象中name属性。

stream().map()

  1. stream().map()提取List对象的某一列值。然后可以通过forEach方法对该对象进行循环输出
复制代码
    private static void printList(List<User> list) {
        List<String> userList = list.stream().map(User::getName).collect(Collectors.toList());

        userList.forEach(u -> System.out.println(u));
    }

stream().sorted()

  • 对list集合进行排序
  1. 对id进行升序排序
java 复制代码
    private static void printSortList(List<User> list) {
    	// 升序排序
        List<User> userList = list.stream().sorted(Comparator.comparing(User::getId)).collect(Collectors.toList());
        userList.forEach(u -> System.out.println(u));
    }
  1. 对id进行降序排序
java 复制代码
    private static void printSortList(List<User> list) {
        // 降序排序
        List<User> userList = list.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
        userList.forEach( u - >System.out.println(u));
    }

流的中间操作

  • 筛选与切片
    filter:过滤流中的某些元素
    limit(n):获取n个元素
    skip(n):跳过n元素,配合limit(n)可实现分页
    distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
java 复制代码
Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);
 
Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14
        .distinct() //6 7 9 8 10 12 14
        .skip(2) //9 8 10 12 14
        .limit(2); //9 8
newStream.forEach(System.out::println);

Stream对象转换为集合

  • collect(Collectors.toList())

  • collect(Collectors.toSet())

  • collect(Collectors.toMap())

AliveSeven
一个有趣的博客
文章
0
标签
0
分类
0
目录
©2021 - 2025 By AliveSeven
欢迎来到我的博客,谢谢你能在茫茫人海中发现我