当前位置:  开发笔记 > 编程语言 > 正文

Java泛型和流

如何解决《Java泛型和流》经验,为你挑选了1个好方法。

我正在建立一种避免重复代码的框架,在某个时候,我需要将对象Foo的列表转换为对象Bar的列表。

我有扩展的数据库实体

public class BaseEntity {...}

以及扩展的演示对象

public class BaseDTO {...}

所以

public class Foo extends BaseEntity {...}

public class Bar extends BaseDTO {
    public Bar(Foo entity, Locale l) {
        ...
    }
}

现在,使用流很容易将Foo列表转换为Bar列表

public abstract ClassThatUsesFooAndBar() {

    public List convertFooToBar(List list) {
        return list.stream().map(f -> new Bar(f, locale)).collect(...);
    }
}

但是,这里有个问题,这些Foo和Bar实际上是泛型(A和B),因此使用Foo和Bar的类实际上是ClassThatUsesAandB,因此该函数也必须是抽象的,并以正确的A和B实现为样板代码实现,因为显然您无法实例化泛型类型。

有没有一种方法可以使用泛型/流/ lambdas创建可以编写一次的函数,从而使实现类无需重新实现它?函数签名为

public List convertAToB(List list);

我希望我已经很清楚了,如果您需要进一步的解释,请询问

谢谢!



1> biziclop..:

我认为最简单的方法是使用lambda进行转换。

public static  List convertList(List list, Function itemConverter) {
    return list.stream().map(f -> itemConverter.apply(f)).collect(...);
}

然后您可以像这样使用它:

List l = convertList(fooList,foo -> new Bar(foo.getBaz()));

或者,如果需要,可以将其提取到其自己的命名类中:

public class Foo2BarConverter implements Function {
    @Override
    public Bar apply(Foo f) {
       return new Bar(f.getBaz());
    }
}

顺便说一句,鉴于我们可以对流进行处理,仅创建一个物化的Bar对象列表来创建新列表似乎有点浪费。转换后,我可能会直接链接要对列表执行的任何操作。


@AdamSkywalker是的,在某些情况下,这是不可避免的。但是,这些模式通常是天真地尝试“升级”代码以使用lambda的结果,通常是通过更改方法的实现而不是改变彼此调用的方式来实现的。再说一次,有时这是您唯一的选择(如果您的方法是公共API的一部分,并且说它应该返回一个“列表”,例如),但是很高兴知道这些限制并不适用,您可以一个更好。
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有