创建了一个 Java 的增强 lambda 库,搬了一些 kotlin 中特别好用的方法过来 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
857681664

创建了一个 Java 的增强 lambda 库,搬了一些 kotlin 中特别好用的方法过来

  •  
  •   857681664
    zshnb 2022 年 4 月 22 日 2557 次点击
    这是一个创建于 1463 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直在 kotlin 和 java 之间来回开发,有时候在写 java 的时候经常想起 kotlin 中特别方便的一些 lambda 方法,找了一圈好像也没找到合适的,就决定自己手撸一个用在自己项目里了,初版还很粗糙,欢迎大佬们提意见。项目地址在 https://github.com/zshnb/extension-lambda

    下面附一段使用说明。

    • 便捷的 map 操作
    // 把一个 map 转成另一个 value 不变,key 不一样的 map java.util.Map<Integer, Integer> map = java.util.Map.of(1, 1, 2, 2, 3, 3); java.util.Map<String, Integer> anotherMap = Map.mapKey(map, entry -> entry.etKey().toString()); // 把一个 map 转成另一个 key 不变,value 不一样的 map java.util.Map<Integer, Integer> map = java.util.Map.of(1, 1, 2, 2, 3, 3); java.util.Map<Integer, String> anotherMap = Map.mapValue(map, entry -> entry.getKey().toString()); // 可以在 lambda 方法里引用 list 的下标 List<Integer> integers = mapIndex(pairs, (index, pair) -> { Assertions.assertEquals(index, atomicInteger.getAndIncrement()); return pair.getLeft(); }).collect(Collectors.toList()); 
    • 分组,转换相关
    // 把 list 转换成 map, key 的值由 lambda 得到 Map<String, Pair<Integer, String>> map = associateBy(pairs, Pair::getRight); // 把 list 转换成 map, value 的值由 lambda 得到 Map<String, Pair<Integer, String>> map = associateWith(pairs, Pair::getRight); // 分组,相同 key 的 item 在一个 list 里,key 由 lambda 得到 Map<Integer, List<Pair<Integer, String>>> map = GroupBy.groupBy(pairs, Pair::getLeft); // 与上面不同的是 list 中的 value 也可以通过 lambda 得到 Map<Integer, List<String>> map = GroupBy.groupBy(pairs, Pair::getLeft, Pair::getRight); 
    • let with
    // with 的 lambda 里返回的是传入的对象 Pair<Integer, Integer> pair = With.with(Pair.pair(1, 2), innerPair -> { innerPair.setLeft(2); innerPair.setRight(3); return innerPair; }); // let 的 lambda 里返回的是 lambda 里最后 return 语句的值 Integer integer = Let.let(Pair.pair(1, 2), Pair::getLeft); 
    • 判断
    // any 任何一个元素符合 predicate, 返回 true, 类似 or boolean result = Any.any(pairs, p -> p.getLeft() % 2 == 0); // all 所有元素符合 predicate,返回 true, 类似 and boolean result = All.all(pairs, p -> p.getLeft() > 0); 
    14 条回复    2022-04-24 15:15:10 +08:00
    nthin0
        1
    nthin0  
       2022 年 4 月 22 日   1
    推荐可以试下这个库[vavr]( https://www.vavr.io/vavr-docs/)
    ychost
        2
    ychost  
       2022 年 4 月 22 日
    这些功能 stream 都有吧,我觉得 Java 缺 C# 的 LINQ ,最近 Groovy 4.0 已经把 LINQ 移植过来了,叫 GINQ

    ```groovy
    @GQ(parallel=true)
    def ginq(x) {
    from n in [1, 2, 3]
    where n < x
    select n
    }
    ```
    857681664
        3
    857681664  
    OP
       2022 年 4 月 22 日
    @ychost stream 好像没有类似 associate 这样的 api ,然后 groupBy 用起来也不是很方便(捂脸
    857681664
        4
    857681664  
    OP
       2022 年 4 月 22 日
    @nthin0 这个库看起来挺牛的,可以借鉴借鉴,但感觉跟我想的还是不太一样
    ychost
        5
    ychost  
       2022 年 4 月 22 日
    @857681664 stream group by/ mapping 确实难用,vavr 这个库不错
    golangLover
        6
    golangLover  
       2022 年 4 月 22 日 via Android
    留名支持一下
    yazinnnn
        7
    yazinnnn  
       2022 年 4 月 22 日
    直接引入 kotlin 标准库,把这些 kotlin 扩展函数当 java 静态函数用咋样?
    857681664
        8
    857681664  
    OP
       2022 年 4 月 22 日
    @yazinnnn 当然可以呀,但是有时候现实情况是不让引入 kotlin
    gabon
        9
    gabon  
       2022 年 4 月 23 日 via iPhone
    streamex 有点像
    857681664
        10
    857681664  
    OP
       2022 年 4 月 23 日 via Android
    @gabon 我去看看,感谢大佬
    1194129822
        11
    1194129822  
       2022 年 4 月 23 日
    kotlin 很多功能,java 高版本也有了。stream 惰性计算比 kotlin 增强集合其实更好,只是 api 可能没那么友好。感觉 kotlin 好用的语法糖也就闭包和扩展了,let ,apply ,with 这些高阶函数挺好用的。
    857681664
        12
    857681664  
    OP
       2022 年 4 月 23 日
    @1194129822 惰性计算 kotlin 也有,其实就是感觉 java 的 lambda 用起来有点罗嗦 hh, 要不然怎么能 kotlin 真香呢。
    Achieve7
        13
    Achieve7  
       2022 年 4 月 24 日
    我现在就把 kt 当 java 的语法糖在使用, 另外协程也挺香的
    857681664
        14
    857681664  
    OP
       2022 年 4 月 24 日
    @Achieve7 是啊,kotlin 的语法比 java 友好很多,在 2 种语言之间切换的明显感受
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     864 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 20:58 PVG 04:58 LAX 13:58 JFK 16:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86