簡體   English   中英

如何根據列表屬性過濾 Java 列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM