首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将参数化的getter称为java 8流中的映射器?

如何将参数化的getter称为java 8流中的映射器?
EN

Stack Overflow用户
提问于 2015-03-12 16:36:43
回答 2查看 2K关注 0票数 3

用例

我目前在许多适配器中都有这种模式:

代码语言:javascript
运行
复制
entries.stream()
        .filter(Entry.class::isInstance)
        .map(Entry.class::cast)
        .map(Entry::getFooBar)
        .collect(Collectors.toList());

其中条目是实现特定接口的对象的List。不幸的是,接口--它是第三方库的一部分--没有定义通用的getter。要创建我想要的对象的列表,我需要搜索它们,转换它们,并调用适当的getter方法。

我打算将它重构为这样一个助手类:

代码语言:javascript
运行
复制
public static <T, O> List<O> entriesToBeans(List<T> entries, 
        Class<T> entryClass, Supplier<O> supplier) {
    return entries.stream()
            .filter(entryClass::isInstance)
            .map(entryClass::cast)
            .map(supplier)                  // <- This line is invalid
        .collect(Collectors.toList());
}

然后,我将调用此方法来执行转换:

代码语言:javascript
运行
复制
Helper.entriesToBeans(entries, 
                      Entry_7Bean.class, 
                      Entry_7Bean::getFooBar);

不幸的是,我不能将getter传递到重构函数并让map调用它,因为map需要一个函数。

问题

  • 如何在重构版本中调用getter?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-12 16:40:03

一种类似于:

代码语言:javascript
运行
复制
class T {
  public O get() { return new O(); }
}

将映射到一个Function<T, O>

因此,只需将方法签名更改为:

代码语言:javascript
运行
复制
public static <T, O> List<O> entriesToBeans(List<T> entries,
        Class<T> entryClass, Function<T, O> converter) {

Update:我怀疑转换的原因是原始列表可能包含不属于Ts的元素。因此,您还可以将签名更改为:

代码语言:javascript
运行
复制
public static <T, O> List<O> entriesToBeans(List<?> entries,
        Class<T> entryClass, Function<T, O> converter) {

例如,您可以传递一个List<Object>,并且只将Ts保存在列表、强制转换和转换中。

作为参考,下面是一个工作示例(打印John, Fred):

代码语言:javascript
运行
复制
static class Person {
  private final String name;
  Person(String name) { this.name = name; }
  String name() { return name; }
}

public static void main(String[] args) {
  List<String> result = entriesToBeans(Arrays.asList(new Person("John"), new Person("Fred")),
                                       Person.class, Person::name);
  System.out.println("result = " + result);
}

public static <T, O> List<O> entriesToBeans(List<?> entries,
        Class<T> entryClass, Function<T, O> converter) {
  return entries.stream()
          .filter(entryClass::isInstance)
          .map(entryClass::cast)
          .map(converter)
          .collect(Collectors.toList());
}
票数 5
EN

Stack Overflow用户

发布于 2015-03-12 16:40:42

您应该传递一个Function<T, O>,而不是:

代码语言:javascript
运行
复制
public static <T, O> List<O> entriesToBeans(List<T> entries, Class<T> entryClass, 
                               Function<T, O> mapper) {
    return entries.stream().filter(entryClass::isInstance)
                  .map(entryClass::cast).map(mapper)
                  .collect(Collectors.toList());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29015397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档