我目前正在玩Java 8 lambda并且遇到一个小问题。
我想做什么
我有一个使用spring构建的原型网站,它接收一个事务对象并将其存储在一个地图中。事务类具有长值和字符串类型(例如酒店)。 我要做的是,运行一个lambda表达式,过滤掉所有具有特定类型的事务对象,并返回一个List,这是它们的键列表。
基本上我只想查看地图中具有特定类型的对象的键列表。
简单测试 我通过填写一个具有汽车类型和值3000的对象来测试它。然后我在网络表单上传递汽车以基于此过滤地图。我输出了输入类型是什么(检查webform正确接收它),存储在Map对象中的类型,如果它们相等且都是正确的,但是lambda仍然返回一个空列表。
我的代码如下:
违规方法:
HashMap<Long, Transaction> transactionMap = new HashMap<>();
@RequestMapping(value = "transactionservice/types/{type}", method=RequestMethod.GET)
public ResponseEntity<List<Long>> getSameType(@PathVariable String type) {
System.out.println("Input type is: " + type);
System.out.println("What is stored at 1: " + transactionMap.get(Integer.toUnsignedLong(1)).getType());
System.out.println("Values are equal: " + type.equals(transactionMap.get(Integer.toUnsignedLong(1)).getType()));
List<Long> listSameType = transactionMap.entrySet()
.stream()
.filter(s -> s.getValue().getType() == type)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println("List size of keys: " + listSameType.size());
return new ResponseEntity<List<Long>>(listSameType, HttpStatus.OK);
}
输出:
Input type is: car
What is stored at 1: car
Values are equal: true
List size of keys: 0
答案 0 :(得分:2)
我认为String
的等式检查失败了:
List<Long> listSameType = transactionMap.entrySet()
.stream()
.filter(s -> s.getValue().getType().equals(type))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
使用equals()
代替==
。