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

下面 Java 代码怎么用 Lambda 表示

  •  
  •   wleexi · 95 天前 · 2185 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (null != shopView.getProvinceId()) {
                Region region = regionService.getById(shopView.getProvinceId());
                shopView.setProvinceDisp(region.getRegionName());
            }
            if (null != shopView.getCityId()) {
                Region region = regionService.getById(shopView.getCityId());
                shopView.setCityId(region.getRegionName();
            }
            if (null != shopView.getDistrictId()) {
                Region region = regionService.getById(shopView.getDistrictId());
                shopView.setDistrictDisp(region.getRegionName());
            }
            if (null != shopView.getStreetId()) {
                Region region = regionService.getById(shopView.getStreetId());
                shopView.setStreetDisp(region.getRegionName());
            }
    
    32 回复  |  直到 2018-12-14 11:04:27 +08:00
        1
    chanchan   95 天前
    Optional.ofNullable(obj).ifPresent(item -> {

    });
        2
    wleexi   95 天前
    @chanchan 每个属性都要写一个?
        3
    chanchan   95 天前
    这种还是 StringUtils.isNoneEmpty(,,,,)吧
        4
    xwbz2018   95 天前
    ```java
    String[] regionNames = Stream.of(shopView.getProvinceId(), shopView.getCityId(), shopView.getDistrictId(), shopView.getStreetId())
    .filter(Objects::nonNull)
    .map(regionService::getById)
    .map(Region::getRegionName)
    .toArray(String[]::new);
    ```
    这样可行不,设置值到 shopView 那部分比较魔法
        5
    wleexi   95 天前
    @chanchan 类型是 Long。。。
    我就是来问问有什么更好的办法做检查并设置值
        6
    wleexi   95 天前
    @xwbz2018 那查询完了之后设置值呢。。按照 index ?
        7
    xwbz2018   95 天前
    @wleexi 魔法一下可以的(这块可以写到 shopView 类里),总不能上反射吧
        8
    wleexi   95 天前
    @xwbz2018 恩 我疑惑的地方就在这边。最后都是调用一样的方法 想精简
        9
    chanchan   95 天前
    @wleexi 兄嘚,你就不能开动一下你的脑筋吗
        10
    wleexi   95 天前
    @chanchan 表达式这块实在不熟 正在学习中 谢谢提点
        11
    xwbz2018   95 天前
    @wleexi 这 getter,setter 是没法省了。。。regionService.getById 如果支持多参数的话,还可以优化一下
        12
    wleexi   95 天前
    @xwbz2018 这个倒是可以
        13
    youngxhui   95 天前 via Android
    这么多空判断不如换成 kotlin
        14
    corningsun   95 天前
    Optional.ofNullable(showView.getProvinceId()).map(RegionService::getById).map(Region::getRegionName).ifPresent(showView::setProvinceDisp);
    Optional.ofNullable(showView.getCityId()).map(RegionService::getById).map(Region::getRegionName).ifPresent(showView::setCityDisp);
    Optional.ofNullable(showView.getDistrictId()).map(RegionService::getById).map(Region::getRegionName).ifPresent(showView::setDistrictDisp);
    Optional.ofNullable(showView.getStreetId()).map(RegionService::getById).map(Region::getRegionName).ifPresent(showView::setStreetDisp);
        15
    lhx2008   95 天前 via Android
    楼上的写法应该是楼主想要的了,不过说实话不如原来的
        16
    johnniang   95 天前
    可以考虑改造 getById()方法

    ```java
    Optional<Entity> getById(Integer id) {

    if(id == null || id <= 0) {

    return Optional.empty();

    }

    ...
    }
    ```

    结合一楼

    ```java
    regionService.getById(shopView.getProvinceId()).ifPresent(region -> shopView.setProvinceDisp(region.getRegionName()));

    ...
    ```
        17
    lhx2008   95 天前 via Android
    想了下,还可以定义一个静态方法
    static void <T> setProperty(Callable<Long> idGetter, Callable<T> regionGetter, Runnable setter)
    里面是 14 楼的代码
    然后传的时候用 lambda
    具体怎么玩楼主研究一下,手机不想打了
        18
    lhx2008   95 天前 via Android
    不一定是 17 楼的代码,原来的代码也行,反正是抽象出来了,可读性也还行吧,泛型不一定要
        19
    lhx2008   95 天前 via Android
    @lhx2008 17->14
        20
    lhx2008   95 天前 via Android
    static <T,R> void setProperty(Callable<Long> idGetter, Callable<T> regionGetter, Consumer<R> setter)
    重新谢了一遍
        21
    xwbz2018   95 天前 via Android
    @xwbz2018 抱歉,随手一写写出 bug 了。应该是:
    String[] regionNames = Stream.of(shopView.getProvinceId(), shopView.getCityId(), shopView.getDistrictId(), shopView.getStreetId())
    .map(id -> id == null ? null : regionService.getById(id))
    .map(Region::getRegionName)
    .toArray(String[]::new);
        22
    Kaiv2   95 天前 via Android
    这不太符合 Lambda 的使用场景。。。
        23
    Nickwongfree   95 天前   ♥ 1
    可以简洁一点,分支太多,4 条基本可以抽象出来新函数
    void setLocation(String locationId, Function<String, Boolean> setFunction) {
    if (locationId!=null) {
    Region region = regionService.getById(locationId);
    setFunction(region.getRegionName());
    }
    }

    4 条调用如下
    setLocation(shopView.getProvinceId(), showView::setProvinceDisp)
    setLocation(shopView. getCityId(), showView:: setCityDisp)
    ....
        24
    Nickwongfree   95 天前
    @Nickwongfree
    line5 应为 setFunction.apply()
        25
    Charkey   95 天前
    函数式接口似乎不错,楼上有了
        26
    binbinyouliiii   95 天前
    有时候强上 Lambda 不觉得可读性会变差吗
        27
    wleexi   94 天前
    @binbinyouliiii 你说的对。这个题目的目的是学习
        28
    wleexi   94 天前
    @Nickwongfree 好像不行,setCityDisp 是 void
        29
    008px   94 天前 via Android
    首先你要明确 Lambda 表达式的使用条件,不是所有都能用的
        30
    CasualYours   94 天前
    @wleexi Function 是接收一个参数,返回一个结果。Consumer 接收一个参数,无返回结果。

    改成这样就行了

    ```
    void setLocation(String locationId, Consumer<String> setFunction) {
    //...
    }
    ```
        31
    CasualYours   94 天前
    @CasualYours 方法内部还要改一句 setFunction.accept(region.getRegionName());
        32
    Raymon111111   94 天前
    不是 lambda 的场景 别硬套了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   787 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 22:01 · PVG 06:01 · LAX 15:01 · JFK 18:01
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1