【问题标题】:Filter an object by specific properties java按特定属性过滤对象java
【发布时间】:2021-05-06 08:38:08
【问题描述】:

所以我有这门课:

public class Seat {
    private Long id;
    private float positionX;
    private float positionY;
    private int numOfSeats;
    private String label;
    //getters and setters
}

我有ListSeat 上课:

List<Seat> seatList = // get data from repository;

我也有这个 arraylist 包含 id 列表:

List<Long> idList; // for example : [1, 2, 3]

我想过滤seatList,以便过滤后的ArrayList不包含id来自idListSeat对象,所以我尝试使用流:

List<Seat> filteredSeat = seatList.stream()
   .filter(seat -> {
         // function to filter seat.getId() so it would return the Seat object with id that does not equals to ids from idList
   })
   .collect(Collectors.toList());

我找不到正确的功能来执行此操作。有人建议我试试吗?

【问题讨论】:

    标签: java arraylist java-stream


    【解决方案1】:

    您想使用 Collection#contains(Object) 中的覆盖方法,并使用否定暗示 id 不是在List 中找到的

    Set<Seat> filteredSeat = seatList.stream()
        .filter(seat -> !idList.contains(seat.getId()))
        .collect(Collectors.toSet());
    

    几点说明:

    • 您想使用Set&lt;Long&gt; 而不是List&lt;Long&gt; 进行有效查找。此外,id 之间存在重复值是没有意义的,因此Set 是一个不错的选择。
    • Collectors.toSet() 结果 Set,所以 Stream 的返回类型是 Set&lt;Seat&gt;

    【讨论】:

      【解决方案2】:

      最简单的解决方案是 for-each 循环,您可以在其中检查每个 idList 与 Seat 的 id。

      可能是这样的

      List<Seat> FilteredList;
      for ( Seat CurSeat : seatList ){
          for(int i = 0; i < idList.size(); i++){
      

      如果 CurSeat 的 ID 是 idList 的一部分,它不会被添加到新列表中。 这绝对不是最简单的方法,但如果你正在寻找简单的方法,这可能就是它。 希望这有帮助!

      【讨论】:

        【解决方案3】:

        假设您相应地实现了equals 方法(就像doc 提到的那样),有一个更短的解决方案:

        seatList.stream()
           .distinct()
           .collect( Collectors.toList() );
        

        【讨论】:

          猜你喜欢
          • 2021-08-05
          • 1970-01-01
          • 1970-01-01
          • 2019-05-30
          • 2017-09-22
          • 2010-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多