栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 流计算 zip 与 zipWithIndex 的快速实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 流计算 zip 与 zipWithIndex 的快速实现

问题描述

在使用 scala 的时候常常用到 zipWithIndex 函数,方便做一些流计算时的处理工作,但是在 Java 中默认情况下没有这个函数,自己实现一下方便复用吧。

代码描述

代码非常简单只需要一行代码,同样是基于流计算而添加的功能。

package cn.smileyan.demo.stream;


import javafx.util.Pair;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;


public class CollectionUtil {

    
    public static  List> zipWithIndex(List list) {
        return IntStream.range(0, list.size()).mapToObj(e -> new Pair<>(list.get(e), e)).collect(Collectors.toList());
    }

    
    public static  List> zip(List list1, List list2) {
        int minSize = Math.min(list1.size(), list2.size());
        return IntStream.range(0, minSize).mapToObj(i -> new Pair<>(list1.get(i), list2.get(i))).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        // 创建一个 list 等待配置索引
        List list = IntStream.range(20, 30).boxed().collect(Collectors.toList());

        List> listWithIndex = CollectionUtil.zipWithIndex(list);
        System.out.println("zipWithIndex");
        listWithIndex.forEach(pair -> System.out.println(pair.getKey() +":" + pair.getValue()));

        System.out.println("zip");
        List list2 = IntStream.range(0, 20).boxed().collect(Collectors.toList());
        List> zipResult = zip(list, list2);
        zipResult.forEach(pair -> System.out.println(pair.getKey() +":" + pair.getValue()));
        
    }
}


zipWithIndex
20:0
21:1
22:2
23:3
24:4
25:5
26:6
27:7
28:8
29:9
zip
20:0
21:1
22:2
23:3
24:4
25:5
26:6
27:7
28:8
29:9
补充说明 索引与值的位置

前面的代码返回结果是两列,第一列是列表数值本身,第二列是索引,这是因为参考 scala 代码的zipWithIndex的代码而实现的,如果不习惯这种方法可以考虑把 index 放在第一列,只需要改变一下位置就可以了。

如果是更复杂的数据

如果需要加入的不是一列数据而是两列数据(类似于表的形式),需要给它们一行一行的添加索引。那么可以考虑用到 org.javatuples 提供的 Tuple 数据结构,对 Tuple 抽象类有多种实现,前面源码用到的是其中的 Pair 类在这里也有实现,也就是只有两个数的时候,类似的还有

  • Triplet 支持三个不同类型的数据
  • Quartet 支持四个
  • Quintet 支持五个
  • Sextet 支持六个
  • Septet 支持七个
  • Octet 支持八个
  • Ennead 支持九个
  • Decade 支持十个

也就是说,本来是三列,那么zipIndex以后就是四列,等等。


    org.javatuples
    javatuples
    compile

总结

最近一直在 stream map filter collect,包括 scala 和 java 的需求。根据实际开发需要我会继续总结经验,分享给需要的小伙伴们,谢谢支持~~

Smileyan
2022.7.21 15:24

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号