下面 Java 代码怎么用 Lambda 表示

2018-12-13 14:51:07 +08:00
 wleexi
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());
        }
3430 次点击
所在节点    程序员
32 条回复
xwbz2018
2018-12-13 18:43:58 +08:00
@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);
Kaiv2
2018-12-13 19:53:37 +08:00
这不太符合 Lambda 的使用场景。。。
Nickwongfree
2018-12-13 21:24:46 +08:00
可以简洁一点,分支太多,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)
....
Nickwongfree
2018-12-13 21:34:38 +08:00
@Nickwongfree
line5 应为 setFunction.apply()
Charkey
2018-12-13 21:36:43 +08:00
函数式接口似乎不错,楼上有了
binbinyouliiii
2018-12-13 23:34:47 +08:00
有时候强上 Lambda 不觉得可读性会变差吗
wleexi
2018-12-14 08:52:55 +08:00
@binbinyouliiii 你说的对。这个题目的目的是学习
wleexi
2018-12-14 09:03:59 +08:00
@Nickwongfree 好像不行,setCityDisp 是 void
008px
2018-12-14 10:00:22 +08:00
首先你要明确 Lambda 表达式的使用条件,不是所有都能用的
CasualYours
2018-12-14 10:05:40 +08:00
@wleexi Function 是接收一个参数,返回一个结果。Consumer 接收一个参数,无返回结果。

改成这样就行了

```
void setLocation(String locationId, Consumer<String> setFunction) {
//...
}
```
CasualYours
2018-12-14 10:08:27 +08:00
@CasualYours 方法内部还要改一句 setFunction.accept(region.getRegionName());
Raymon111111
2018-12-14 11:04:27 +08:00
不是 lambda 的场景 别硬套了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/517227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX