当前位置: 首页 > 知识库问答 >
问题:

为什么不能用Java声明函数数组?[重复]

尉迟鸿熙
2023-03-14

我习惯像这样声明数组内联:

    String s1 = "world";
    String[] strings = { "world" };

为什么我不能对函数执行相同的操作?假设我有一个类Book,其中包含getTitle()and 方法,这是有效的:

    Function<Book, String> f1 = Book::getTitle;
    System.out.println(f1.apply(myBook));

但是,这不是:

    Function<Book, String>[] funcs = { Book::getTitle, Book::getAuthor };
    for (Function<Book, String> f2 : funcs) {
        System.out.println(f2.apply(myBook));
    }

它不喜欢内联数组声明,编译器错误是“不能创建函数的泛型数组”

编辑 我认为我的问题不是建议的副本,因为我想使用数组初始值设定项语法静态定义一组函数

共有1个答案

轩辕修能
2023-03-14

你可以试试这个:

public static void testFunction() {
    Map<String, Function<Book, String>> mapToFunctions = new HashMap<>();

    Function<Book, String> myFunction = x -> new String(x.getTitle());

    mapToFunctions.put("firstfunction", myFunction);

    for (Function<Book, String> f : mapToFunctions.values()) {
        System.out.println(f.apply(new Book("my title")));
    }
}

更新:

使用

package com.victor.main;

import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;

public class FunctionalTest {
    public static void testFunction() {
        Set<Function<Book, String>> mapToFunctions = new HashSet<>();

        Function<Book, String> myFunction = x -> new String(x.getTitle());

        mapToFunctions.add(myFunction);

        for (Function<Book, String> f : mapToFunctions) {
            System.out.println(f.apply(new Book("my title")));
        }
    }

    public static void main(String[] args) {
        testFunction();
    }
}

 类似资料:
  • 问题内容: 目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript 3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数: 在此函数签名中,作者已将scoreTable参数

  • 问题内容: 我想知道为什么Java数组声明使用大括号而不是标准括号。如此处所示。我认为总体上可能需要进一步理解大括号,但这是我现在的议程。 相反,这是正确的。 问题答案: 圆括号通常表示集合和合奏,而圆括号通常表示类似C语言的参数。 很久以前,人们已经习惯了与C进行这种约定。我非常确定它可以在Java中以这种方式工作,以与旧语言保持某种语法一致性。

  • 问题内容: 在开始阅读之前:这个问题不是关于理解monad的问题,而是关于确定Java类型系统的局限性的,这会限制接口的声明。 在我的努力去理解单子我读这个由埃里克利珀SO- 答案上询问单子简单的解释问题。在那里,他还列出了可以在monad上执行的操作: 有一种方法可以将未放大类型的值转换为放大类型的值。 有一种方法可以将未放大类型的操作转换为遵循前面提到的功能组成规则的放大类型的操作 通常,有一

  • %1有编译器错误,而%2是合法的。 为什么变量声明的类型必须与我们传递给对象类型的类型匹配(不允许派生类型)?我使用的数组如下所示,这是完全正确的: 有人能告诉我为什么集合必须声明为条件2吗?谢谢

  • 问题内容: 看完之后,我才知道,是物体。数组的名称不是实际的数组,而只是引用。new运算符在堆上创建数组,并返回对新创建的数组对象的引用,然后将其分配给数组变量(名称)。类似于以下内容: 但是我也使用了这两种类型的数组声明。 和 以上两项均合法且可以正常工作。那么这两者之间有什么区别,我应该何时使用它们? 问题答案: 这将生成一个大小为5的数组,其中包含5个null元素: 如果这些值在编译时不是您

  • 我声明了一个自定义trait 的数组,以便在Rust中试验多态性,但是编译器似乎在第一个元素的子类型上进行类型推断: 编译器抱怨第一个元素是< code>Cat而不是其他元素: 向数组中添加类型也不能解决问题。因为这一次我得到了更多的错误: