gpt4 book ai didi

java - 函数接口(interface)作为 lambda 来对集合进行排序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:20 25 4
gpt4 key购买 nike

我正在研究 lambda 表达式,并且正在努力研究如何使用 java.util.function.Function 对集合进行排序。有人可以帮助我或给我一些关于如何实现这一目标的指示吗?

我有一本书 POJO 和一个将书籍存储在集合中的类。我正在尝试使用 Function 接口(interface)的 lambda 表达式来返回相同但已排序的集合。我可以使用 Collections.sort() 并以这种方式返回它,但我认为有一种方法可以使用 Function 接口(interface)来完成。

public class BookTable {

private Map<Integer, Book> bookMap;

public BookTable() {
this.bookMap = new HashMap<>();
}

public void addBook(Book book) {
bookMap.put(size(), book);
}

public int size() {
return bookMap.size();
}

public List<Book> getRecord(int key) {
return Collections.singletonList(bookMap.get(key));
}

public List<Book> getRecordsWhere(Predicate<Book> predicate) {
return bookMap.values()
.stream()
.filter(predicate)
.collect(Collectors.toList());
}

public List<Book> getSortedRecords(Function<Book, Comparable> fieldExtractor) {
// Return sorted list....
}
}

预订 POJO

public class Book {

private String title;
private String author;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}
}

只是一个快速测试...

public class BookTableTest {

public static void main(String[] args) {

File file = new File("booklist.csv");
BookTable table = new BookTable();

Book book1 = new Book();
book1.setAuthor("Author 1");
book1.setTitle("Title 1");

Book book2 = new Book();
book2.setAuthor("Book 2 Author 1");
book2.setTitle("Book 2 Title 1");

Book book3 = new Book();
book3.setAuthor("The best author");
book3.setTitle("The best title");

table.addBook(book3);
table.addBook(book1);
table.addBook(book2);

System.out.println("## Sorted by Title");
System.out.println(table.printRecords(table.getSortedRecords(Book::getTitle)));

System.out.println();
System.out.println("## Sorted by Author");
System.out.println(table.printRecords(table.getSortedRecords(Book::getAuthor)));

}
}

最佳答案

流的部分值(value)在于不必重新发明所有的排序、过滤和收集方法。我没有使用过滤方法、排序方法、打印方法等,而是只使用一种返回 Collection<Book> 的方法。 .让调用者对该集合做任何他们想做的事情。

public Collection<Book> getRecords() {
return bookMap.values();
}

...

table.getRecords().stream()
.filter(book -> book.getAuthor().equals("Charles Dickens"))
.sorted(Comparator.comparing(Book::getTitle))
.forEach(System.out::println);

这种方法的优点是它允许用户按照他们喜欢的方式将不同的操作链接在一起。他们可以过滤排序打印,如果这是他们想要做的。

关于java - 函数接口(interface)作为 lambda 来对集合进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39261693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com