Java 8 lambda根据应用于地图对象的过滤器返回一个空的地图键列表

时间:2016-07-17 18:31:58

标签: java spring list lambda java-8

我目前正在玩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

1 个答案:

答案 0 :(得分:2)

我认为String的等式检查失败了:

List<Long> listSameType = transactionMap.entrySet()
        .stream()
        .filter(s -> s.getValue().getType().equals(type))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());

使用equals()代替==