java - 不使用 Lambda 表达式对流进行模型映射

标签 java generics java-stream method-reference modelmapper

我不是 Java 开发人员,但我有多年的 C# 经验。我有一个List<Foo>我需要转换为 List<Bar>使用ModelMapper哪里FooBar具有本质上相同的属性。

目前我已将其写为:

@AutoWired ModelMapper modelMapper;

...

List<Bar> results = repository
        .getFoos()
        .stream()
        .map(x -> modelMapper.map(x, Bar.class))
        .collect(Collectors.toList());

这很好用。然而,我觉得 lambda 表达式可以用一个简单的方法引用来替换。如果这是 C#,我可能能够做一些类似的事情:

var results = repository.getFoos().Select(modelMapper.map<Bar>).ToList();

但是我在 Java 中找不到正确的语法。我试过这个:

.map(modelMapper::<Bar>map)

但我收到错误:

Cannot resolve method 'map'

我不确定这是否是因为我以某种方式混淆了语法,或者这是因为 map 方法有太多重载而无法创建明确的引用。如果有帮助的话, map 的过载我尝试使用的定义为:

public <D> D map(Object source, Class<D> destinationType)

有什么方法可以在不使用 lambda 表达式的情况下实现此映射吗?

最佳答案

I am not sure if this is because I've mixed up the syntax somehow, or this is because the map method has a too many overloads to create an unambiguous reference.

你并没有搞乱语法; Java 中没有类似的东西(它通常比 C# 更冗长,流也不异常(exception)。)

只有当您要传递给方法的参数与功能接口(interface)中的参数相同且顺序相同时,才能使用方法引用(双冒号)语法。

对于map,只有一个参数,您需要将第二个参数(即Bar.class)传递给modelMapper.map (),因此不允许使用方法引用语法。使用它的唯一方法是,将 modelMapper 子类化以仅与 Bar 一起使用,从而消除对第二个的需要显式类参数。

我非常有信心您使用的方法是 Java 中最简洁的方法。

关于java - 不使用 Lambda 表达式对流进行模型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084491/

相关文章:

java - 如何在带有 lambda 表达式的 Java 8 中使用多个流和 .map 函数

java - 如何标记文件中的字符串?

java - 是否可以创建其成员仅实现多个接口(interface)的类型安全的 Java 集合?

java - DatagramPacket - Java 是否首先对其进行分段和重新排列?

java - 识别文件中的某个字符并将其隐藏以防止执行

swift - "Cannot convert value of type ' T '..."泛型

c# - 使用 C# Generics 进行界面设计

c# - 简化 C# 中的循环泛型约束?

java - 我可以使用 Stream 将一个元素映射到多个元素吗?

java - 在 Java8 parallelStream() 中使用 I/O + ManagedBlocker 有什么问题吗?