【问题标题】:What are the uses of constructor reference in java 8java 8中构造函数引用的用途是什么
【发布时间】:2015-06-05 20:14:17
【问题描述】:

我正在阅读有关 Java 8 功能的信息,这使我想到了 article,我想知道构造函数引用的实际用途,我的意思是为什么不直接使用 new Obj

P.S,我试过谷歌搜索,但我没有找到有意义的东西,如果有人有代码示例,链接或 tut 会很棒

【问题讨论】:

    标签: functional-programming java-8 method-reference


    【解决方案1】:

    首先,你应该明白构造函数引用只是方法引用的一种特殊形式。方法引用的要点是它们不调用被引用的方法,而是提供一种方法来定义一个函数,该函数将在被评估时调用该方法。

    链接文章的示例可能看起来没那么有用,但这是简短的独立示例代码的普遍问题。这与“hello world”程序相同。它并不比直接在控制台中输入文本“hello world”更有用,但无论如何也不是这样。它的目的是演示编程语言。

    作为assylias has shown,有些用例涉及使用JFC API 的现有功能interfaces。


    关于将与构造函数引用一起使用的自定义函数式接口的有用性,您必须考虑使用(函数式)interface 的一般原因:抽象

    由于interface 的目的是抽象底层操作,所以用例是您想要执行无条件new SomeType(…) 操作的地方。

    所以一个例子是众所周知的 Factory 模式,您可以定义一个 interface 来构造一个对象并通过构造函数引用实现工厂只是 一个 选项无限可能。

    另一个重要的一点是各种泛型方法,其中需要构造类型实例的可能性,由于类型擦除而未知。它们可以通过作为参数传递的函数来实现,是否需要现有的函数 interfaces 之一或自定义函数仅取决于所需的参数数量和类型。

    【讨论】:

    • 非常感谢 Holger,我一定会多次回来再读一遍,我认为这些点在我的脑海中越来越清晰但尚未连接:) 干杯!
    【解决方案2】:

    当您需要提供构造函数作为供应商或函数时,它很有用。例子:

    List<String> filtered = stringList.stream()
            .filter(s -> !s.isEmpty())
            .collect(Collectors.toCollection(ArrayList::new)); //() -> new ArrayList<> ()
    
    Map<String, BigDecimal> numbersMap = new HashMap<>();
    numbersMap.computeIfAbsent("2", BigDecimal::new); // s -> new BigDecimal(s)
    
    someStream.toArray(Object[]::new); // i -> new Object[i]
    

    等等

    【讨论】:

    • 非常感谢,但是文章中提到的功能界面怎么样,他们是否添加了除 Obj::new 之外的任何快捷方式或功能
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多