Java Stream 中的三元运算符等价写法

3

我正在尝试比较两个变量一系列操作的最终结果。由于操作是相同的,我在这两个变量上使用了Java流。但我需要基于对象的子变量返回结果。例如:

class MyClass {
  String strVal;
  Integer intVal;
}

MyClass myFunction(MyClass myClass1, MyClass myClass2) {
   Stream.of(myClass1, myClass2)
      .map(function) // get intVal for both objects
      .filter(predicate)
      ...
   // return myClass1 if myClass1.intVal > myClass2.intVal, otherwise myClass2
   // current implementation
   return myClass1.intVal > myClass2.intVal ? myClass1 : myClass2;

}

在流中是否有可以使用的三元运算符? 或许需要创建新的功能接口?

我提出这个问题的原因是,这不是代码中唯一需要基于比较结果获取值的地方。有些地方我需要使用像下面这样的函数:

return myClass1.intVal > myClass2.intVal ? function(myClass1) : function(myClass2);

我理解流的实现方式,就像下面提到的评论部分。但是整个概念是为了让代码更加清晰。因此,如果有一种更干净的方法只使用一个函数返回值,那么比为所有变量重复使用该函数要好。


1
你认为 Stream.of(myClass1, myClass2) 是什么意思?它会遍历 myClass1,然后是 myClass2。你无法同时访问这两个对象。不清楚你的问题是什么。你现有的实现已经很好了。 - Jim Garrison
@JimGarrison,请查看已编辑的问题。 - Sophia
2
它总是只有两个元素吗?如果是这样,我认为在这里使用流是过度的。如果不是,那么我嗅到了一个XY问题,你应该提供更具体的例子来说明你想要实现什么。流似乎是正则表达式的21世纪版本。一个看起来很酷的闪亮新工具,因为它很酷而被误用。 - Jim Garrison
2
如果您不想重复调用 function(...),为什么不直接编写 return function(... ? myClass1 : myClass2);?或者您可以将三元运算结果分配给一个变量,然后 return function(result); - kaya3
3
那么,你应该在问题中准确描述这一点,而不是描述完全不同的事情。 - Holger
显示剩余6条评论
1个回答

0
  public static MyClass myFunction(MyClass myClass1, MyClass myClass2) {
    List<MyClass> list = List.of(myClass1,myClass2);
    return list.stream().max(Comparator.comparing(MyClass::getIntVal))
                        .orElseThrow(NoSuchElementException::new);
}

所以我不想返回最大的int值,我想返回具有最大intVal的对象。 - Sophia
没有必要创建一个List来调用stream()。一开始就使用Stream.of(myClass1, myClass2)更好。然后,当你知道属性具有int类型时,最好使用Comparator.comparingInt。在这种情况下不会有太大影响,但这是一个好习惯。除非你被困在Java 8中,否则可以直接使用orElseThrow(),而不需要显式地使用NoSuchElementException::new - Holger
2
@Sophia,这个答案的代码确实会返回对象。 - Holger
1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接