Java Stream API将lambda表达式存储为变量

亚历克斯

这个标题甚至对我来说听起来都是愚蠢的,但是必须至少有某种巧妙的方法才能达到这种效果,而且我不知道还有什么其他解释方法。我需要使用在流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)

以及每个排序顺序的两个不同流。

马可13

这个问题根本不是愚蠢的。从广义上回答:不幸的是,没有通用的解决方案。这是由于类型推断所致,该推断可根据目标类型确定lambda表达式的一种特定类型。(有关类型推断的部分在这里可能会有所帮助,但不会涵盖有关lambda的所有详细信息)。

特别地,lambda likex -> y没有任何类型。所以没有办法写

GenericLambdaTypefunction = 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 -> truelambda,以便以后可以将其传递给两个函数-您只能将其存储稍后将需要的类型的引用

Function<Integer, Boolean> f = x -> true;
Predicate<Integer>         p = x -> true;
useF(f);
useP(p);

对于您的特殊情况,康斯坦丁·约夫科夫(Konstantin Yovkov)回答已经显示了解决方案:您必须将其存储为Comparator<Integer>(忽略此事实,您首先不需要在这里使用lambda……)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章