我发现了这个关于使用限定符进行可迭代到不可迭代映射的示例:
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface FirstElement {
}
public class MapperUtils {
@FirstElement
public <T> T first(List<T> in) {
if (in != null && !in.isEmpty()) {
return in.get(0);
}
else {
return null;
}
}
}
@Mapping(target = "emailaddress", source = "emails", qualifiedBy = FirstElement.class )
但是,如果我想从emails集合的第一个元素中提取一个特定的字段,例如,就像我处理codeemails.get(0).getEmailAddress
一样?
例如,我希望编写如下的映射:
@Mapping(target = "emailaddress", source = "emails[0].emailAddress")
您只需要更改mapperutils
public class MapperUtils {
@FirstElement
public String firstEmailAddress(List<Person> in) {
if (in != null && !in.isEmpty()) {
return in.get(0).getEmailAddress();
}
else {
return null;
}
}
}
基本上,带注释方法的参数应该具有要映射的iterable
,返回类型应该是要映射的non-iterable
。
如果不想为映射创建自定义映射,另一种方法是使用expression
属性。
例如:
@Mapping(target = "emailaddress", expression = "emails != null && !emails.isEmpty() ? emails.get(0).getEmailAddress() : null")
但是,要小心,如果您犯了错误,使用该表达式可能会导致编译时问题。MapStruct不检查表达式的有效性,而是按原样使用它。
我目前正在面对mapstruct和它的初学者问题,其中一个是以下问题。 我知道示例方案:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable 希望对象结构清晰。在源代码中有两个列表,应该为每个列表选择第一个元素。MapStruct如何做到这一点?
mapMap.map(i => i * 30); const mapReduce = Immutable.Map({ a: 10, b: 20, c: 30 });
当一个对象实现了属性时,我们认为它是可迭代的。 一些内置的类型如Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自的Symbol.iterator。 对象上的Symbol.iterator函数负责返回供迭代的值。 for..of 语句 for..of会遍历可迭代的对象,调用对象上的Symbol.iterator属性。 下面是在数组上使用for.
问题内容: 我需要一个Map,它可以 按其值 的降序进行迭代。是否有像Apache Commons或Guava这样的标准库提供这种地图? 问题答案: 我会用番石榴来做到这一点,如下所示:
假设我有一个包含集合的对象,所述集合上的每个元素都包含一个集合,每个集合都包含一个集合。 我想在最深的对象上迭代,并对其应用相同的代码。 命令式的方法是微不足道的,但有没有一种方法来完成这一切? 我可以看到如何从最深的循环中生成lambda: 但我能做得更多吗?
问题内容: 我正在尝试迭代由numpy.linspace生成的值的数组: 这段代码在我的办公室计算机上工作正常,但是今天早上我坐下来在另一台机器上在家工作,出现了此错误: 只是一个浮点数数组,脚本在打印内容时没有问题-只是显然对它们进行了迭代。关于导致它损坏的原因的任何建议以及可能的解决方法? 问题答案: 给您一维NumPy数组。例如: 因此: 无法工作。您将需要某种二维数组,在第二维中具有两个元