为什么Java中不能声明函数数组?

4

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

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

为什么我不能对函数做同样的事情呢?例如,我们有一个类 Book,其中包含方法 getTitle()getAuthor(),下面的代码是合法的:

    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));
    }

它不喜欢内联数组声明,编译器错误是“无法创建Function的通用数组”

编辑 我认为我的问题与建议的重复问题不同,因为我想使用数组初始化程序语法静态定义一组函数


尝试使用Map,像这样 Map<String, Function<Book, String>> mapToFunctions = new HashMap<>(); - Victor M Perez
如果是一个通用类型,你需要使用 funcs = new Function<Book, String>[] { Book::getTitle }; - Héctor
@Héctor 这会产生相同的错误。 - batwad
Function[] funcs = { (Function<Book, String>) Book::getTitle };。(注:该文本为Java编程语言中的代码示例,因此翻译时应保留原文中的专业术语和格式) - Ole V.V.
如果你想对所有书籍(假设它们是一个列表)应用相同的方法调用,你可以简单地执行 List<String> titles = books.stream().map(Book::getTitle).collect(Collectors.toList()); 然后执行 titles.stream().forEach(System.out::println); 来打印它们。创建一个相同函数的数组是多余的。 - ichantz
@ichantz 我的例子大大简化了实际情况;实际上,我想在一个数组或列表中静态定义许多函数,并依次在多个实例上调用它们。 - batwad
1个回答

2
你可以尝试这个方法:
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")));
    }
}

更新:

使用 Set<Function<Book, String>>,代码应该如下:

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();
    }
}

当有许多函数时,这将变得难以维护,因为您必须为它们命名和使用lambda表达式。我真的想要一个简单的列表。 - batwad
尝试使用 Set<Function<Book, String>> funSet = new HashSet<>(); - Victor M Perez
我更新了答案,使用了 Set<Function<Book, String>> 的版本。 - Victor M Perez
谢谢。看起来这属于“由于类型擦除而不可能”的类别。 - batwad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接