V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
857681664
V2EX  ›  程序员

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

  •  
  •   857681664 ·
    zshnb · 2022-04-22 21:43:10 +08:00 · 1747 次点击
    这是一个创建于 706 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直在 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.getKey().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-04-22 22:04:38 +08:00   ❤️ 1
    推荐可以试下这个库[vavr]( https://www.vavr.io/vavr-docs/)
    ychost
        2
    ychost  
       2022-04-22 22:07:24 +08:00
    这些功能 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-04-22 22:08:55 +08:00
    @ychost stream 好像没有类似 associate 这样的 api ,然后 groupBy 用起来也不是很方便(捂脸
    857681664
        4
    857681664  
    OP
       2022-04-22 22:10:32 +08:00
    @nthin0 这个库看起来挺牛的,可以借鉴借鉴,但感觉跟我想的还是不太一样
    ychost
        5
    ychost  
       2022-04-22 22:15:20 +08:00
    @857681664 stream group by/ mapping 确实难用,vavr 这个库不错
    golangLover
        6
    golangLover  
       2022-04-22 22:19:54 +08:00 via Android
    留名支持一下
    yazinnnn
        7
    yazinnnn  
       2022-04-22 22:32:03 +08:00
    直接引入 kotlin 标准库,把这些 kotlin 扩展函数当 java 静态函数用咋样?
    857681664
        8
    857681664  
    OP
       2022-04-22 22:40:41 +08:00
    @yazinnnn 当然可以呀,但是有时候现实情况是不让引入 kotlin
    gabon
        9
    gabon  
       2022-04-23 09:48:21 +08:00 via iPhone
    streamex 有点像
    857681664
        10
    857681664  
    OP
       2022-04-23 11:52:36 +08:00 via Android
    @gabon 我去看看,感谢大佬
    1194129822
        11
    1194129822  
       2022-04-23 12:16:19 +08:00
    kotlin 很多功能,java 高版本也有了。stream 惰性计算比 kotlin 增强集合其实更好,只是 api 可能没那么友好。感觉 kotlin 好用的语法糖也就闭包和扩展了,let ,apply ,with 这些高阶函数挺好用的。
    857681664
        12
    857681664  
    OP
       2022-04-23 13:04:25 +08:00
    @1194129822 惰性计算 kotlin 也有,其实就是感觉 java 的 lambda 用起来有点罗嗦 hh, 要不然怎么能 kotlin 真香呢。
    Achieve7
        13
    Achieve7  
       2022-04-24 13:39:04 +08:00
    我现在就把 kt 当 java 的语法糖在使用, 另外协程也挺香的
    857681664
        14
    857681664  
    OP
       2022-04-24 15:15:10 +08:00
    @Achieve7 是啊,kotlin 的语法比 java 友好很多,在 2 种语言之间切换的明显感受
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3876 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:17 · PVG 18:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.