java进阶|java8Stream数据处理全面总结

java8提供了对集合数据进行处理一系列数据的方法,今天就全面解析一下其用法,也是自己对其的一个总结性文章的结束了,后面就不再写这样的文章了。

关于Stream的用法,记住原点,中间操作,终端操作这三个知识点就可以了。

整个代码的示例程序已经包含了整个用法的详细解释,这里就不一一用文字进行描述了。

package com.wpw.springbootjuc.java8;


import lombok.extern.slf4j.Slf4j;


import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;


/**
 * 使用最新的Stream流数据api进行数据处理
 *
 * @author wpw
 */
@Slf4j
public class CollectionTest {
    private static final List<Person> personList = new ArrayList<>();


    static {
        personList.add(Person.builder().build().setId(1L).setName("张三").setAge(15).setAddress("浙江"));
        personList.add(Person.builder().build().setId(2L).setName("李四").setAge(15).setAddress("河南"));
        personList.add(Person.builder().build().setId(3L).setName("王五").setAge(16).setAddress("北京"));
        personList.add(Person.builder().build().setId(4L).setName("赵六").setAge(16).setAddress("上海"));
        personList.add(Person.builder().build().setId(5L).setName("孙七").setAge(17).setAddress("浙江"));
    }


    /**
     * 数据过滤的测试
     */
    private static List<Person> DataFilter(List<Person> personList) {
        /**
         * 这里我们过滤年龄是15&地址是浙江的数据
         */
        return personList.stream().filter(x -> x.getAge() == 15 && x.getAddress().equals("浙江")).collect(Collectors.toList());
    }


    /***
     * 数据的输出print
     */
    public static void acceptDataAndPrint(List<Person> personList) {
        personList.forEach(x -> System.out.println("x = " + x));
    }


    /**
     * 数据的转换或者可以说是处理map
     *
     * @return
     */
    public static List<Integer> mapHandler(List<Person> personList) {
        /***
         * 只获取年纪这个字段的数据,进行数据的收集
         * 其它字段的数据收集类推
         */
        return personList.stream().map(Person::getAge).collect(Collectors.toList());
    }


    /**
     * 数据集合的去重distinct
     *
     * @return
     */
    public static List<String> distinctHandler(List<Person> personList) {
        /**
         * 处理数据集合地址重复的数据,然后进行收集
         */
        return personList.stream().map(Person::getAddress).distinct().collect(Collectors.toList());
    }


    /**
     * 数据集合的自然排序
     *
     * @return
     */
    public static List<Person> sortHandler(List<Person> personList) {
        return personList.stream().sorted().collect(Collectors.toList());
    }


    /***
     *数据集合的自定义排序
     * @return
     */
    public static List<Person> sortHandlerWithComparator(List<Person> personList) {
        /**
         * 按照年级进行排序,你可以根据自己的需求进行排序
         */
        return personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
    }


    /**
     * 数据集合的limit,想到mysql这样的db用法了
     *
     * @return
     */
    public static List<Person> limitHandler(List<Person> personList) {
        /**
         * 只会过滤出前两条数据
         */
        return personList.stream().limit(2).collect(Collectors.toList());
    }


    /**
     * 数据集合skip方法的使用
     *
     * @return
     */
    public static List<Person> skipHandler(List<Person> personList) {
        /**
         * 跳过前两个数据,然后进行数据的收集
         */
        return personList.stream().skip(2).collect(Collectors.toList());
    }


    /**
     * 数据的收集聚合操作reduce
     *
     * @return
     */
    public static String reduceHandler(List<Person> personList) {
        return personList.stream().map(Person::getAddress).reduce("地址集合", (x, y) -> x + y);
    }


    /**
     * 返回数据集合中年纪最大的数据max
     *
     * @return
     */
    public static Person maxHandler(List<Person> personList) {
        return personList.stream().max(Comparator.comparing(Person::getAge)).orElse(null);
    }


    /**
     * 返回数据集合中年纪最小的数据min
     *
     * @return
     */
    public static Person minHandler(List<Person> personList) {
        return personList.stream().min(Comparator.comparing(Person::getAge)).orElse(null);
    }


    /**
     * 判断数据集合是否全部满足某一规则
     *
     * @return
     */
    public static boolean allMatchHandler(List<Person> personList) {
        return personList.stream().map(Person::getAddress).allMatch("浙江"::equals);
    }


    /**
     * 判断数据集合是否任意满足某一规则
     *
     * @return true/false
     */
    public static boolean anyMatchHandler(List<Person> personList) {
        return personList.stream().map(Person::getAddress).anyMatch("浙江"::equals);
    }


    /**
     * 判断数据集合是否全部不满足某一规则
     *
     * @return true/false
     */
    public static boolean noneMatchHandler(List<Person> personList) {
        return personList.stream().map(Person::getAddress).noneMatch("郑州"::equals);
    }


    /**
     * 统计数据集合的数据count
     *
     * @return count汇总数据的个数
     */
    public static long countHandler(List<Person> personList) {
        return personList.stream().count();
    }


    /**
     * 处理数据集合中,满足执行条件的第一个数据findFirst
     *
     * @return
     */
    public static Person findFirstHandler(List<Person> personList) {
        return personList.stream().filter(x -> x.getAddress().equals("浙江")).findFirst().orElse(null);
    }


    /**
     * 数据转集合,集合转数据的介绍toArray
     *
     * @return
     */
    public static Object[] toArrayHandler(List<Person> personList) {
        return personList.stream().map(Person::getAddress).toArray();
    }


    /**
     * 数据集合转为map
     *
     * @return
     */
    public static Map<Object, Object> listToMapHandler(List<Person> personList) {
        /**
         * 按照地址进行map的转换
         */
        return personList.stream().collect(Collectors.toMap(Function.identity(), Person::getAddress));
    }


    /**
     * 处理map的数据信息
     */
    public static void mapDataHandler(Map<Object, Object> map) {
        map.forEach((key, value) -> {
            System.out.println(String.format("键%s--值:%s", key, value));
        });
    }


    /**
     * map转集合数据
     *
     * @return
     */
    public static List<Object> mapToListHandler(Map<Object, Object> map) {
        return map.values().stream().collect(Collectors.toList());
    }


    /**
     * 数据集合转换流
     *
     * @return
     */
    public static Stream<Object> listToStreamHandler(List<Person> personList) {
        return Stream.of(personList.toArray());
    }


    public static void main(String[] args) {
        log.debug("数据集合的filter操作");
        acceptDataAndPrint(DataFilter(personList));
        log.debug("数据集合的map操作");
        List<Integer> integerList = mapHandler(personList);
        integerList.stream().forEachOrdered(x -> System.out.print(x + "\t"));
        log.debug("数据集合的去重操作");
        List<String> stringList = distinctHandler(personList);
        stringList.forEach(x -> System.out.print(x + "\t"));
        log.debug("数据集合的自然排序操作");
        acceptDataAndPrint(sortHandler(personList));
        log.debug("数据集合的自定义排序");
        acceptDataAndPrint(sortHandlerWithComparator(personList));
        log.debug("数据集合的limit限制数据的返回");
        acceptDataAndPrint(limitHandler(personList));
        log.debug("数据集合的skip跳过指定数据的处理");
        acceptDataAndPrint(skipHandler(personList));
        log.debug("数据集合的聚合操作");
        String handler = reduceHandler(personList);
        System.out.println("handler = " + handler);
        log.debug("返回数据的最大值数据");
        Person person = maxHandler(personList);
        System.out.println("person = " + person);
        log.debug("返回数据的最小值数据");
        Person p = minHandler(personList);
        System.out.println("p = " + p);
        log.debug("数据直接的allMatch操作");
        boolean matchHandler = allMatchHandler(personList);
        System.out.println("matchHandler = " + matchHandler);
        log.debug("数据直接的anyMatch操作");
        boolean anyMatchHandler = anyMatchHandler(personList);
        System.out.println("anyMatchHandler = " + anyMatchHandler);
        log.debug("数据直接的noneMatch操作");
        boolean noneMatchHandler = noneMatchHandler(personList);
        System.out.println("noneMatchHandler = " + noneMatchHandler);
        log.debug("数据集合的统计操作");
        long count = countHandler(personList);
        System.out.println("count = " + count);
        log.debug("数据集合的findFirst操作");
        Person firstHandler = findFirstHandler(personList);
        System.out.println("firstHandler = " + firstHandler);
        log.debug("数据集合转为数组的操作");
        Object[] objects = toArrayHandler(personList);
        Arrays.stream(objects).forEachOrdered(System.out::println);
        log.debug("数据集合转为map操作");
        Map<Object, Object> map = listToMapHandler(personList);
        mapDataHandler(map);
        Map<String,String>  hashMap = new HashMap<>(16,0.75f);
        hashMap.put("key","value");
        hashMap.put("key2","value2");
        hashMap.put("key3","value3");
        log.debug("map转为集合的操作");
        List<Object> objectList = mapToListHandler(map);
        objectList.stream().forEach(System.out::println);
        log.debug("转为数据流Stream的操作");
        Stream<Object> stream = listToStreamHandler(personList);
        List<Object> collect = stream.collect(Collectors.toList());
        collect.forEach(System.out::println);
    }
}


关于集合的Stream操作就到这里结束了,还是喜欢那简单而有用的示例程序,java基础性的文章终于告一段落了。文中的实体类person主要包含id,name,age,address字段用于测试,自己在用时新建一个就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值