使用Java流进行筛选==>;自定义对象到哈希集的哈希映射

使用Java流进行筛选==>;自定义对象到哈希集的哈希映射,java,collections,hashmap,java-stream,hashset,Java,Collections,Hashmap,Java Stream,Hashset,如何过滤两个自定义对象的Hashmap以过滤、流式处理并收集到map--->map 在下面的具体示例中,如何按抵押类型进行筛选以获得一种最低利率(最低利率%)的抵押类型 请帮助我使用图片概念化MS Excel工作表中的结构,并尝试在Java代码中表示 对我来说,使用图片更容易概念化。下面的图表是我在MS Excel上实际拥有的,但是我不确定我是否必须正确编码 比如说,在这个场景中,我希望创建一个HashSet并按房屋类型进行过滤,获得利率最低的房屋,而不考虑期限和贷款;意思是忽略术语和loan

如何过滤两个自定义对象的Hashmap以过滤、流式处理并收集到map--->map

在下面的具体示例中,如何按抵押类型进行筛选以获得一种最低利率(最低利率%)的抵押类型

请帮助我使用图片概念化MS Excel工作表中的结构,并尝试在Java代码中表示

对我来说,使用图片更容易概念化。下面的图表是我在MS Excel上实际拥有的,但是我不确定我是否必须正确编码

比如说,在这个场景中,我希望创建一个HashSet并按房屋类型进行过滤,获得利率最低的房屋,而不考虑期限和贷款;意思是忽略术语和loanID。 (为了简洁起见,所有数据类型都是string.Still sortable)

在上面的实例中,所需和预期的输出应该是一个包含绿色高亮显示值的哈希集

最终期望输出

如何通过Streams、Java8、9、10、11实现这一点

请在github查看这里的代码。((我正在学习使用github,如果需要什么,请告诉我。)请提供建议。多谢各位

package-Loans\u-Packages;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
导入java.util.stream.collector;
公共班机{
公共静态void main(字符串[]args){
Map Loan_Contracts=new HashMap();
列表行=新的ArrayList();
列表项=新的ArrayList();
抵押物抵押对象0=新抵押(“木材”,“15年”);
房屋。添加(抵押对象0);
抵押抵押对象1=新抵押(“木材”,“30年”);
房屋。增加(1);
抵押抵押对象2=新抵押(“砖块”、“30年”);
增加(2);
抵押物抵押物3=新抵押物(“砖块”、“15年”);
增加(3);
文件loanObject0=新文件(“5A”,“利息5.0%”);
条款。添加(loanObject0);
文件loanObject1=新文件(“5B”、“利息3.5%”);
条款。添加(loanObject1);
文件loanObject2=新文件(“5C”、“利息3.5%”);
条款。添加(loanObject2);
文件loanObject3=新文件(“5D”,“利息1.5%”);
条款。添加(loanObject3);
贷款合同(房屋、条款);
系统输出打印(贷款合同);
System.out.println();
System.out.println();
//System.out.println();
//Map filteredhouse=Loan_Contracts.entrySet()
//.stream()
//.filter(条目->条目.getValue())
//.collect(Collectors.toMap(e->e.getKey(),e->e.getValue().get(0));
//.sorted(Map.Entry.comparingByKey())
}
}

如评论中所述,
贷款合同
映射不需要将
列表
作为键/值。使用
Mortgage
作为键和
Document
作为值就足够了,因此它们形成了一个表示行的
Map.Entry

然后可以从
房屋
术语
列表中创建如下新地图:

Map Loan\u Contracts=IntStream.range(0,houses.size())
.mapToObj(i->Map.entry(houses.get(i),terms.get(i)))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
然后,可以按以下方式检索按类型以最小速率过滤的房屋:

Loan_Contracts.entrySet().stream()
.collect(收集器.groupingBy(e->e.getKey().getType(),
Collectors.minBy(Comparator.comparing(e->e.getValue().getRate()))
))
.forEach((k,v)->System.out.printf(“类型=%s,%s%n”,
k、 v.map(map.Entry::getValue.orElse(null));
输出:

type=WOOD, Document(loanId=5B, rate=Interest_3.5%)
type=BRICK, Document(loanId=5D, rate=Interest_1.5%)

我没有必要将抵押贷款列表映射到文档列表,这样您就可以将所有抵押贷款映射到所有文档,从而丢失它们之间的一对一关联或单个
IntStream.range(0,houses.size()).boxed().collect(Collectors.toMap(I->houses.get(I).getType(),terms::get,binarymoperator.minBy(Comparator.comparing(Document::getRate)).forEach((type,doc)->System.out.println(“type=“+type+”,“+doc))
请注意,创建一个
映射没有任何意义。条目
下一步将隐式创建
映射
条目,此外,使用
toMap
而不是
groupingBy
避免处理
可选项
。Alex/Vincendep/Holger…。感谢您的初始输入。不过,我有以下原因:或者显式设置结构。GW我将在几天内详细说明。不着急。同时,请您将输出显示为Map的HashMap而不是println。谢谢。
type=WOOD, Document(loanId=5B, rate=Interest_3.5%)
type=BRICK, Document(loanId=5D, rate=Interest_1.5%)