![](/img/trans.png)
[英]How can I filter employee list based on the "City filter list" and maintain the filter order using java 8
[英]How can I filter a Java List based on a list attribute
你好:)我一直在嘗試根據其屬性之一過濾 java 列表,這真的很難:這是我的模型:
@Table(name="tools_table")
public class Tools implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String title;
private String link;
private String description;
@ElementCollection(targetClass=String.class)
private List<String> tags;
(還有 getter、setter 和構造函數)
我需要創建一個方法來過濾在列表 TAG 中具有特定標記的工具。 基本上,按標簽過濾工具。
例如,如果我有三個工具 ({name: one, tags:[cake, dogs, pink]},{name: two, tags:[cake, rabbits, blue]},{name: three, tags:[cake , horses, red]}) 然后我用標簽 CAKE 過濾它們,他們三個必須回來。 但是,如果我通過標簽 RED 過濾它們,則只應返回第三個。
我希望我解釋得很好:)
這是我正在嘗試使用的方法:
@GetMapping("?tag={tags}")
public ResponseEntity<List<Tools>> findByTag(@PathVariable String tags){
List<Tools> allTools=repo.findAll();
allTools.stream().filter(t-> t.getTags().contains(tags)).collect(Collectors.toList());
return ResponseEntity.ok().body(allTools);
}
但是每當我發出傳遞所需標簽的請求時,它都會返回所有對象,但不會過濾它們!
我感謝任何試圖提供幫助的人 <3
您確定@GetMapping("?tag={tags}")
會將?tag=
參數放入@PathVariable String tags
參數中嗎? 我認為這行不通,您必須做簡單的@GetMapping
並注釋參數,例如@RequestParam("tag") String tags
。
此外,正如評論和其他答案中已經提到的, stream()
不會修改它所操作的集合 - 因此您必須返回allTools.stream()...collect(Collectors.toList())
的結果。
但最重要的是(雖然只是與問題間接相關),你正在做的是從數據庫中獲取所有內容並在 memory 中進行過濾。這將殺死你真正的應用程序,其中可能有成千上萬的工具。 即使這個特定的應用程序只包含少數幾個工具,這也是一種不好的做法,將來肯定會“咬”你。 讓數據庫處理此操作,例如使用 JPA 查詢,如SELECT t FROM Tools t WHERE:tag MEMBER OF t.tags
。
您沒有將過濾后的 output 分配給新列表。 下面修改后的代碼將起作用。
@GetMapping("?tag={tags}")
public ResponseEntity<List<Tools>> findByTag(@PathVariable String tags){
List<Tools> allTools=repo.findAll();
List<Tools> filteredTools = allTools.stream().filter(t-> t.getTags().contains(tags)).collect(Collectors.toList());
return ResponseEntity.ok().body(filteredTools);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.