Java 8中调用方法

3

我有一个方法,

private String createSubjectColumnForOutgoing(Message message)
{
    //TODO : Changes for blocking messages of spam users


    if(message.getReceiverEnvelope() != null && message.getReceiverEnvelope().getUser() != null && message.getReceiverEnvelope().getUser().isBlocked())
    {
        return I18N.IN_REVIEW_BY_TEAM.msg();
    }


    return StringUtils.deSanitizeSpecialCharacters(message.getSubject());
}

这种方法被称为这样调用:
case OUTGOING:
            table.addGeneratedColumn(I18N.MESSAGETABLE_HEADER_SUBJECT.msg(), this::createSubjectColumnForOutgoing);
            break;

而类中的构造函数是:

public MessageTable(Directory directory, boolean withFilter, Device device)
{
    this(directory, new FilterConfiguration(withFilter), device);
}

public MessageTable(Directory directory, FilterConfiguration filterConfiguration, Device device)
{
    Objects.requireNonNull(directory);
    Objects.requireNonNull(device);

    this.directory = directory;

    dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(LocaleAware.super.getLocale());

    tableFooter = createTableFooter();

    openButton = createOpenButton();
    newButton = createNewButton();
    messageTable = createTable(device);

    tableFooter.addComponent(newButton, 0);
    tableFooter.addComponent(openButton, 1);

    final VerticalLayout layout = new VerticalLayout();
    layout.addComponent(createFilterComponent(filterConfiguration));
    layout.addComponents(tableFooter, messageTable);
    layout.setComponentAlignment(tableFooter, Alignment.MIDDLE_LEFT);

    rootLayout = layout;
    setCompositionRoot(rootLayout);

}

调用createSubjectColumnForOutgoing方法时,没有传递任何参数,并且它能够正常工作。我不明白Message对象中的数据来自哪里。我搜索了一下,但是不明白。请帮忙解答。谢谢。
添加生成列的代码
public void addGeneratedColumn(Object id, Function<BEANTYPE, ?> generatedColumn)
{
    String header = null;
    if(id instanceof String)
    {
        header = (String) id;
    }
    addGeneratedColumn(header, id, (source, itemId, columnId) -> generatedColumn.apply(itemId));
}
1个回答

2

this::createSubjectColumnForOutgoing 是一个方法引用,而不是执行 createSubjectColumnForOutgoing 方法。

你传递给 table.addGeneratedColumn() 方法的是这个方法引用,该方法可能会调用由此方法引用实现的函数接口的方法。如果是这样,它会向其传递一个 Message 实例。

由于你没有包含 addGeneratedColumn() 的代码,因此我不知道它期望什么类型的函数接口(也许是 Function)。

编辑:

根据你的编辑,Function<BEANTYPE, ?> generatedColumn 是由你传递给 addGeneratedColumn() 的方法引用实现的函数接口。这意味着 generatedColumn.apply(itemId) 是执行 createSubjectColumnForOutgoing() 方法的语句,并且可以看到将 itemId 传递给了该方法。这意味着 itemId 必须是一个 Message 实例。

请注意,addGeneratedColumn(Object id, Function<BEANTYPE, ?> generatedColumn) 也不会执行 createSubjectColumnForOutgoing() 方法。它传递了一个函数接口(由 lambda 表达式实现),该函数接口可以执行该方法,传递给第二个 addGeneratedColumn 方法。


我已经更新了问题,并附上了addGeneratedColumn()的代码。 - swayam swayam
感谢 @Eran 的帮助。 - swayam swayam

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