这个标题甚至对我来说听起来都是愚蠢的,但是必须至少有某种巧妙的方法才能达到这种效果,而且我不知道还有什么其他解释方法。我需要使用在流API中排序的数组进行排序。到目前为止,这是我的信息流:
Arrays.stream(sequence.split(" "))
.mapToInt(Integer::parseInt)
.boxed()
.sorted((a, b) -> a.compareTo(b))
.forEach(a -> System.out.print(a + " "));
现在,我有两种不同的过程-升序和降序,并且我需要使用的类别在用户输入中指定。因此,我想做的是在2种情况下进行类似switch的操作:“ ascending”和“ descending”,以及一个分别存储lambda表达式的变量:
switch(command) {
case "ascending": var = a.compareTo(b);
case "descending": var = b.compareTo(a);
}
然后我的排序如下:
.sorted((a, b) -> var)
我在参加的python课程中得到了这个主意。在那里可以将对象存储在变量中,从而使变量“可执行”。我意识到这个lambda并不是一个对象,而是一个表达式,但是我想问是否有任何聪明的方法可以达到这样的结果,或者我应该
if(var)
以及每个排序顺序的两个不同流。
这个问题根本不是愚蠢的。从广义上回答:不幸的是,没有通用的解决方案。这是由于类型推断所致,该推断可根据目标类型确定lambda表达式的一种特定类型。(有关类型推断的部分在这里可能会有所帮助,但不会涵盖有关lambda的所有详细信息)。
特别地,lambda likex -> y
没有任何类型。所以没有办法写
GenericLambdaType
function = x -> y;
然后function
用作实际lambda的直接替代品x -> y
。
例如,当您有两个功能
static void useF(Function<Integer, Boolean> f) { ... }
static void useP(Predicate<Integer> p) { ... }
你可以用相同的lambda来称呼它们
useF(x -> true);
useP(x -> true);
但是无法以某种方式“存储” x -> true
lambda,以便以后可以将其传递给两个函数-您只能将其存储在稍后将需要的类型的引用中:
Function<Integer, Boolean> f = x -> true;
Predicate<Integer> p = x -> true;
useF(f);
useP(p);
对于您的特殊情况,康斯坦丁·约夫科夫(Konstantin Yovkov)的回答已经显示了解决方案:您必须将其存储为Comparator<Integer>
(忽略此事实,您首先不需要在这里使用lambda……)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句