Java 8在Bifunction中映射computeIfPresent布尔检查

时间:2017-02-24 21:12:11

标签: java lambda java-8 java-stream

这是代码的Java 8之前的方式,

Album testAlbum = (Album) testMap.get(testField);

List < Album > testList = new ArrayList();

if (testAlbum != null) {
 if (isFree) {
  if (applyFreeFilter(testAlbum)) {
   testList.add(testAlbum);
  }
 } else {
  testList.add(testAlbum);
 }
}

尝试使用compute if present,以避免多个if else,但卡住了。

这是一种矫枉过正,还是我在BiFunction中遗漏了一些东西来处理地图上的值?

testMap.computeIfPresent(testField, (k, v) -> {
 if (isFree) {
  if (applyFreeFilter((Album) v)) {
   testList.add((Album) v);
  }
 } else {
  testList.add((Album) v);
 }
});

1 个答案:

答案 0 :(得分:2)

你的代码的一部分肯定是一种矫枉过正。 它可以很简单:

if(!isFree || applyFreeFilter((Album) v)) {
    testList.add((Album) v);
 }

如果isFreefalse,则applyFreeFilter不会执行,您可以节省时间。

关于if (testAlbum != null)检查,这不错,但您可以将testAlbum包裹在Optional<Album>中,然后您可以写testAlbum.ifPresent(theAlbum -> doSomething(theAlbum));。我认为你没有使用k变量...所以computeIfPresent在你的代码中也有点过分。

总结我的解决方案将是:

Optional<Album> testAlbum = Optional.ofNullable((Album) testMap.get(testField));
final List <Album> testList = new ArrayList();
testAlbum.ifPresent(theAlbum -> {
    if(!isFree || applyFreeFilter((Album) theAlbum))
        testList.add((Album) theAlbum);
});

6行代码而不是初始代码13。