Java 8:输入功能接口列表并在 .stream() 之后动态调用它们

Jef*_* Xi 3 java java-stream

我有以下方法:


public void caller(){
    List<Class1> data1 = Arrays.asList(new Class1(), new Class1() ...);
    List<Class2> data2 = Arrays.asList(new Class2(), new Class2() ...);

    // The following is what I'm trying to implement:
    List<BiConsumer<Class1, Double>> peeks1 = Arrays.asList(Class1::setOneNum, Class1::setAnotherNum, Class1:: setMoreNum);
    List<BiConsumer<Class2, Double>> peeks2 = Arrays.asList(Class2::setSomeNum1, Class2::setSomeNum2);

    helper(data1, peeks1);
    helper(data2, peeks2);
    ...
}

private <T> List<T> helper(List<T> data, List<BiConsumer<T, Double>> peeks) {

        for(BiConsumer<T, Double> singlePeek: peeks){
            data = data.stream()
                    .peek(a -> singlePeek.accept(a, math.random()))
                    .collect(Collectors.toList());
        }

        return data;
    }
Run Code Online (Sandbox Code Playgroud)

Class1and有其他共同的实​​现Class2,唯一的区别是在 the 之后调用的方法,.stream()这就是为什么我试图将这些函数“合并”为一个helper

哪里BiConsumer有二传手。我想在 stream() 之后调用 setter 列表。但是我无法将功能接口列表输入到helper()(我尝试的是Arrays.asList(Class1::setNum, Class1::setAnotherNum, Class1::setMoreNum)不能作为输入工作,因为Array.asList()只接受Object)。那么有什么解决办法吗?谢谢!

@user7 感谢您指出。我粗心了,但我已经修正了“错别字”。并添加了调用者功能。

rmu*_*nge 5

当您调用 .asList 方法时,您必须指定目标类型:

Arrays.<BiConsumer<Object, Double>>asList(Class1::setOneNum, ...)
Run Code Online (Sandbox Code Playgroud)

更新:

根据问题的更新代码,Arrays.asList的结果没有直接交给helper方法,所以不需要显式类型。

代码不起作用的唯一可能原因是:

  1. 至少其中一个方法 (setOneNum, setSomeNum1, ...) 有错误的参数类型

  2. 至少其中一种方法不是静态的