【问题标题】:What is the full version of this lambda expression?这个 lambda 表达式的完整版本是什么?
【发布时间】:2018-05-29 01:32:16
【问题描述】:

我很难理解这个 toArray 函数。有人可以在不使用 lambda 箭头或双 :: 冒号方法参考的情况下提供此方法的完整上下文吗?

如果我知道这个toArray 代码的完整非缩短版本应该如何看待并理解程序正在尝试做什么而不是记住某些表达式,这将更有帮助。它更多的是关于编程素养。

这里的完整上下文是我正在尝试使用预设数据从另一个类转换流阅读器。读者的数据被转换为Stream<String> 方法,我的目标是将streamData 转换为String 数组。

public List<WordCountResult> countWordOccurrences(BufferedReader reader) throws Exception {
    try {
        //  word,  occurrences     
        Map<String, Integer> data = new TreeMap<>(); //TreeMap arranges items by natural order.
        Stream<String> streamData = reader.lines();
        String[] stringArray;
        stringArray = streamData.toArray(size -> new String[size]);
    }
    catch(Exception ex1) {
        System.out.println("Processing error.");
    }
}

【问题讨论】:

  • documentation 表示“返回一个包含该流元素的数组,使用提供的生成器函数分配返回的数组”
  • 如果您想了解 lambda 在“常规代码”中的转换方式以及其他方式,您可以尝试 IntelliJ。此编辑器可识别可重写为 lambda 的部分代码,并可将 lambda 转换回 java8 之前的版本。

标签: java toarray


【解决方案1】:

toArray() 接受 IntFunction&lt;String[]&gt; - 这是一个接收 int 大小并返回该大小的数组的函数。非 lambda 版本如下所示:

stringArray = streamData.toArray(new IntFunction<String[]>() {
    @Override String[] apply(int size) {
        return new String[size];
    }
});

【讨论】:

    【解决方案2】:

    toArray 实现了IntFunction 接口。如果没有 lambda,它看起来像这样:

    private static class MyArrayGenerator implements IntFunction<String[]> {
        @Override
        public String[] apply(int size) {
            return new String[size];
        }
    }
    
    [...]
    
        stringArray = streamData.toArray(new MyArrayGenerator());
    

    因为IntFunction 是具有单个抽象方法的FunctionalInterface,您可以使用紧凑的 lambda 语法定义一个。类型将由编译器推断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多