配列データの処理について話すjava--Stream

いくつかの配列データの処理に関して、あなた自身がそれを忘れて探すのを防ぐために、いくつかの一般的に使用される方法がここに記録されています。

一般的に、一部のリストの処理には、グループ化、並べ替え、マージ、配置などが含まれ、データベースとの対話が途中で含まれる場合があります。もちろん、一部のjarパッケージでは、配列データのカプセル化が優れています。注意を払うことができます。それを達成するために「特別な」方法を使用する必要がないようにすることは、面倒であるだけでなく、エレガントでもありません。

1.バッチのデータ

一部のバッチデータ処理には、データのグループ化が含まれます。

List<Integer> list = Arrays.asList(23, 18, 20, 2, 12, 9, 6, 14, 1, 87, 15, 99);
//1、直接分组(推荐)
 List<List<Integer>> partition = Lists.partition(list, 10); //10个一组,封装到partition中
//2、可以个人处理
 int num = list.size()/10 + list.size()%10==0?0:1; //计算要切割成几份
 // 然后使用循环截取。不过要注意的是要和list的大小比较,防止下标溢出       
      for (int i = 0; i < num; i++) {
            if((i+1)*10<list.size()){
                List<Integer> integerList = list.subList(i * 10, (i + 1) * 10);
                // integerList to do sth
            } else {
                List<Integer> integerList = list.subList(i * 10, list.size());
                // integerList to do sth
            }
        }

2.データの合計

   List<Book> bookList = new ArrayList<>();
        // BigDecimal类型求和
        BigDecimal sum = bookList.stream().map(book -> book.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);

        // int、double、long类型求和
        int sumInt = bookList.stream().mapToInt(book -> book.getWidth()).sum();
        long sumLong = bookList.stream().mapToLong(book -> book.getLength()).sum();
        double sumDouble = bookList.stream().mapToDouble(book -> book.getHight()).sum();

3.カスタマイズされた並べ替え

//定制排序,可以根据条件定义排序,一个或多个条件均可以,下面适示意的是从大到小排序
// 判断条件是自己写的,可以根据需要来,仿写的话没啥大问题哈
public class Book implements Comparable<Book> {

    private String name;

    private BigDecimal price ;

    private Long length;

    private Integer width;

    private Double hight;

    @Override
    public int compareTo(Book o) {
        if(o.getWidth()>this.getWidth()){
            return 1;
        } else if(o.getWidth()<this.getWidth()){
            return -1;
        }
        return 0;
    }
 }

4.データは条件ごとにグループ化されています

これに遭遇したかどうかはわかりませんが、より一般的に使用されています。たとえば、本を見つけた場合は、その本の場所に応じてグループ化できます。もちろん、これも可能です。データベース内にありますが、コードで処理する必要がある場合があります。サブクエリのバッチもあり、データが対応している場合、それは対応するグループのグループです。


        List<Book> bookList = new ArrayList<>();

        Book book = new Book();
        book.setWidth(12);
        book.setName("Ebook");
        bookList.add(book);

        Book book1 = new Book();
        book1.setWidth(2);
        book1.setName("java");
        bookList.add(book1);

        Book book2 = new Book();
        book2.setWidth(17);
        book2.setName("java");
        bookList.add(book2);

        Map<String, List<Book>> groupMap= bookList.stream().collect(Collectors.groupingBy(vo -> vo.getName()));

        System.out.println(JSON.toJSONString(groupMap));

印刷物は名前でグループ化されています:

{"java":[{"name":"java","width":2},{"name":"java","width":17}],"Ebook":[{"name":"Ebook","width":12}]}

グループ化プロセスはvo-> vo.getName()を使用し、必要に応じて独自のロジックを実装できます

5.データはキーと値によって処理されます

後続の操作を容易にするために、オブジェクトをキーと値の形式に分割する必要がある場合があります。これに対処する方法もあります。

       List<Book> bookList = new ArrayList<>();

        Book book = new Book();
        book.setWidth(12);
        book.setName("Ebook");
        bookList.add(book);

        Book book1 = new Book();
        book1.setWidth(2);
        book1.setName("java");
        bookList.add(book1);

        Book book2 = new Book();
        book2.setWidth(17);
        book2.setName("java");
        bookList.add(book2);
        
        // 这个是固定写法,后面的 (p1, p2) -> p2)是指如果有两个value相同,是选择前一个p1,还是选择后一个p2作为map的value,如下,名称java对应的就是后一个了(17),value覆盖
        Map<String, Integer> map = bookList.stream().collect(Collectors.toMap(voKey -> voKey.getName(), voValue -> voValue.getWidth(), (p1, p2) -> p2));
        System.out.println(JSON.toJSONString(map));

もちろん、同じキーで値を累積または連結することもできます。

       Map<String, Integer> map = bookList.stream().collect(Collectors.toMap(voKey -> voKey.getName(), voValue -> voValue.getWidth(), (p1, p2) -> p1+p2));

補足:6。重複を取り除くためのフィルター

フィールドに応じた重複排除

        List<Book> bookList = new ArrayList<>();
        bookList.add(new Book("语文书", "12.3", "张三"));
        bookList.add(new Book("语文书", "12.3", "李四"));
        bookList.add(new Book("数学书", "16.3", "张三"));
        bookList.add(new Book("英语书", "11.3", "王五"));
        bookList.add(new Book("数学书", "16.3", "何柳"));
        // 过滤掉bookList中 书籍相同的数据
        List<Book> resultList = bookList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
                new TreeSet<>(Comparator.comparing(Book::getName))), ArrayList::new));
        System.out.println("结果:" + JSONArray.toJSONString(resultList));

結果が出力されます。

结果:[{"author":"张三","name":"数学书","price":"16.3"},{"author":"王五","name":"英语书","price":"11.3"},{"author":"张三","name":"语文书","price":"12.3"}]


それはあなた自身のニーズに依存します。他の複雑な処理が必要な場合はそれを実装することもできますが、それがより複雑な場合は、あなた自身の設計を検討し、設計を最適化できるかどうかを確認する必要があります〜

一時的に思い浮かぶリスト処理は少ないので、後で思いついたら追加しましょう!

よろしければお褒めの言葉をください〜

犠牲も勝利もありません!

おすすめ

転載: blog.csdn.net/zsah2011/article/details/108848401