Java Lambda - 如何在复杂的嵌套 lamda 中插入条件

Java Lambda - How to insert a conditional within a complicated nested lamda

我有一些现有代码需要添加条件。在下面,如果“at”的值为“FOOBAR”,那么我需要“accessTypeHit.right.getSourceAsString()”而不是“accessTypeHit.right.getSortValues()”。否则,它应该仍然是“accessTypeHit.right.getSortValues()”。

由于嵌套 lambda 的复杂性,我很难弄清楚如何解决这个问题。我将不胜感激任何想法。谢谢。

public class DSHTAFunction implements Function<SearchHits, List<ImmutablePair<String, Set<AObject>>>> {
@Override
public List<ImmutablePair<String, Set<AObject>>> apply(@NonNull SearchHits searchHits) {


    return StreamSupport.stream(searchHits.spliterator(), false).map(searchHit -> {
                String id = searchHit.getFields().get(ID_FIELD).getValue();
                Set<AObject> AObjects = Sets.newHashSet();

                AObjects.addAll(ATM.INSTANCE.getTypes().stream()
                                             .flatMap(at -> {
                                                if (searchHit.getInnerHits() == null) {
                                                    return Stream.empty();
                                                }

                                                return Arrays.stream(searchHit.getInnerHits().getOrDefault(at.getIFName(), SearchHits.empty())
                                                                             .getHits()).map(h -> ImmutablePair.of(at, h));})

                                             .flatMap(accessTypeHit ->
                                                              Arrays.stream(accessTypeHit.right.getSortValues())
                                                                      .filter(sv -> sv != null)
                                                                      .map(sv -> new AObject(accessTypeHit.left, sv.toString())))
                                             .filter(AObject::isNonDefault).collect(Collectors.toSet()));


                return ImmutablePair.of(id, AObjects);
            }).collect(Collectors.toList());

}

将每个嵌套的 flatMap 函数提取到它自己的方法中。那么你的工作就会变得简单很多

public class DSHTAFunction implements Function<SearchHits, List<ImmutablePair<String, Set<AObject>>>> {

  @Override
  public List<ImmutablePair<String, Set<AObject>>> apply(@NonNull SearchHits searchHits) {
    return StreamSupport.stream(searchHits.spliterator(), false).map(this::hitsToPairs).collect(Collectors.toList());
  }

  private ImmutablePair<String, Set<AObject>> hitsToPairs(SearchHit searchHit) {
    String id = searchHit.getFields().get(ID_FIELD).getValue();
    Set<AObject> AObjects = ATM.INSTANCE.getTypes().stream()
        .flatMap(at -> accessTypeHits(searchHit, at))
        .flatMap(this::toAObject)
        .collect(Collectors.toSet());

    return ImmutablePair.of(id, AObjects);
  }

  private Stream<ImmutablePair<AccessType, Hit>> accessTypeHits(SearchHit searchHit, AccessType at) {
    if (searchHit.getInnerHits() == null) {
      return Stream.empty();
    }

    return Arrays.stream(searchHit.getInnerHits().getOrDefault(at.getIFName(), SearchHits.empty()).getHits())
        .map(h -> ImmutablePair.of(at, h));
  }

  private Stream<AObject> toAObject(ImmutablePair<AccessType, Hit> accessTypeHit) {
    return Arrays.stream(accessTypeHit.right.getSortValues())
        .filter(Objects::nonNull)
        .map(sv -> new AObject(accessTypeHit.left, sv.toString())))
        .filter(AObject::isNonDefault);
  }
}