JAVA8 Stream 入门&范例

public static void main(String[] args) {
    List<Person> persionList = new ArrayList<Person>();
    persionList.add(new Person(1,"张三","男",38));
    persionList.add(new Person(2,"小小","女",2));
    persionList.add(new Person(3,"李四","男",65));
    persionList.add(new Person(4, "王五", "女", 20));
    persionList.add(new Person(5, "赵六", "男", 38));
    persionList.add(new Person(6, "大大", "男", 65));

    //datasource --> (filter --> map -->...一系列中间操作形成的流水线) --> collect|toList|findFirst 终端操作

    //map_demo(persionList);

    //filter_demo(persionList);

    //sort_demo();

    sort_demo2(persionList);
}

//map中间件相关例子
private static void map_demo(List<Person> persionList) {

    //1、只取出该集合中所有姓名组成一个新集合
    List<String> names = persionList.stream().map(Person::getName).collect(Collectors.toList());
    System.out.println(names.toString());

    //2、只取出该集合中所有id组成一个新集合
    List<Integer> ids = persionList.stream().mapToInt(Person::getId).boxed().collect(Collectors.toList());
    System.out.println(ids.toString());

    //3、list转map,key值为id,value为Person对象
    Map<Integer, Person> map = persionList.stream().collect(Collectors.toMap(Person::getId, Function.identity()));
    System.out.println(map.toString());

    //4、list转map,key值为id,value为name
    Map<Integer, String> map1 = persionList.stream().collect(Collectors.toMap(Person::getId, Person::getName));
    System.out.println(map1.toString());

    //5、进行map集合存放,key为age值 value为Person对象 它会把相同age的对象放到一个集合中
    Map<Integer, List<Person>> ageMap = persionList.stream().collect(Collectors.groupingBy(Person::getAge));
    System.out.println(ageMap.toString());

    //6、获取最小、大、和的年龄
    Integer ageMin = persionList.stream().mapToInt(Person::getAge).min().getAsInt();

    Integer ageMax = persionList.stream().mapToInt(Person::getAge).max().getAsInt();

    Integer ageSum = persionList.stream().mapToInt(Person::getAge).sum();

    //不确定你的key是否唯一
    Map<Integer, String> map2 = persionList.stream().collect(
            Collectors.toMap(Person::getAge, Person::getName, (key1, key2) -> key1)
    );

    Map<Integer, String> map3 = persionList.stream().collect(
            Collectors.toConcurrentMap(Person::getAge, Person::getName, (key1, key2) -> key1, ConcurrentHashMap::new)
    );

    Map map4 =LongStream.rangeClosed(1, 1000).boxed().collect(Collectors.toConcurrentMap(i -> UUID.randomUUID().toString(), Function.identity(), (o1,o2)->o1, ConcurrentHashMap::new));
    System.out.println(map4);
}

//filter相关例子
private static void filter_demo(List<Person> personsList){
    //1、查找年龄大于20岁的人数
    long count = personsList.stream().filter(person -> person.getAge()>20).count();
    System.out.println(count);

    //2、查找年龄大于20岁,性别为男的List
    List<Person> persons = personsList.stream().filter(person -> person.getAge() > 20).filter(person1 -> person1.getSex().equals("男")).collect(Collectors.toList());
    System.out.println(persons);
}

//sort 相关例子
private static void sort_demo(){
    String[] arr1 = {"abc","a","bc","abcd"};

    //按照字符长度排序
    Arrays.stream(arr1).sorted(Comparator.comparing(String::length)).forEach(System.out::println);

    /**
     * 倒序
     * reversed(),java8泛型推导的问题,所以如果comparing里面是非方法引用的lambda表达式就没办法直接使用reversed()
     * Comparator.reverseOrder():也是用于翻转顺序,用于比较对象(Stream里面的类型必须是可比较的)
     * Comparator. naturalOrder():返回一个自然排序比较器,用于比较对象(Stream里面的类型必须是可比较的)
     */
    Arrays.stream(arr1).sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::println);
    //输出:abcd、abc、bc、a
    Arrays.stream(arr1).sorted(Comparator.reverseOrder()).forEach(System.out::println);
    //输出:bc、abcd、abc、a
    Arrays.stream(arr1).sorted(Comparator.naturalOrder()).forEach(System.out::println);
    //输出:a、abc、abcd、bc

    //先按照首字母排序,之后按照String的长度排序
    new ConcurrentHashMapPerformanceController().testSorted(arr1);
}

public void testSorted(String[] arr1){
    Arrays.stream(arr1).sorted(Comparator.comparing(this::ownComp).thenComparing(String::length)).forEach(System.out::println);
}

//自定义比较器
public char ownComp(String x){
    return x.charAt(0);
}

private static void sort_demo2(List<Person> personList){
    //1、找到年龄最小的岁数
    Collections.sort(personList, (x, y) -> x.getAge().compareTo(y.getAge()));
    Integer age = personList.get(0).getAge();
    System.out.println(age);

    //2、找到年龄最小的姓名
    String name = personList.stream().sorted(Comparator.comparing(x -> x.getAge())).findFirst().get().getName();
    System.out.print(name);
}

private static void distinct_demo(List<Person> personList){
    // 根据id去重
    List<Person> unique = personList.stream().collect(
            collectingAndThen(
                    toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new)
    );
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入了Stream API,它是一种处理集合数据的新方式。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方式,不需要显式地编写循环,使得代码更加简洁。 3. 函数式编程:Stream API支持函数式编程风格,可以通过Lambda表达式来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的间操作和终止操作来对集合进行处理。间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值