برای خود من این متد یکم عجیب بود و کاربردش رو نمیفهمیدم. خب متدی نیست که تو روال عادی بهش نیاز پیدا کنید و برای موقعیتهای خاص کاربرد داره و واسه همین درکش سخت میشه. ولی یه مثال واقعی پیدا کردم که فک کنم کامل متوجه موضوع بشید.
قبلش یه توضیح کوتاه بدم : ما وقتی میتونیم رو استریم کار کنیم و متدهایی مثل filter و sort و غیره رو اجرا کنیم که آبجکت استریم ما همچین نوع سادهای داشته باشند:
Stream<String>
اما اگه همچین نوعی داشته باشیم بجای بالایی :
Stream<String[]> \\OR Stream<List<String>> \\ OR something like these
در این حالت ما ارور نداریم اما کارها انجام نمیشن! اینجا اونجاییه که ما به flatMap نیاز داریم بریم سراغ مثال:
این کلاس ساده Student رو درنظر بگیرید :
public class Student { private String name; private Set<String> book = new HashSet<>(); public void addBook(String book) { this.book.add(book); } //getters and setters }
حالا بیاین دوتا آبجکت دانش آموز بسازیم و بذاریمشون تو یه لیست:
Student obj1 = new Student(); obj1.setName("Parsa"); obj1.addBook("Java 8 in Action"); obj1.addBook("Spring Boot in Action"); obj1.addBook("Effective Java (2nd Edition)"); Student obj2 = new Student(); obj2.setName("Kiarash"); obj2.addBook("Effective Java (2nd Edition)"); List<Student> list = new ArrayList<>(); list.add(obj1); list.add(obj2);
حالا فرض کنید میخوایم یه لیست داشته باشیم از کل کتابای دانش آموزا. خب اگه map کنیم همچین خروجی خواهیم داشت :
List<Set<String>> books = list.stream() .map( s->s.getBook() ) .collect(Collectors.toList()) ;
خب همچین خروجی بدرد ما نمیخوره و بعدا نمیشه باهاش کار مفیدی کرد باتوجه به نکتهای که اول گفتم. پس بعد از اینکه map کردیم میام یه flatMap هم روش اجرا میکنیم. دقت کنید اینجا map موقعی که اجرا میشه و تموم میشه آبجکتی استریمی از ستها برمیگردونه و واسه همین آخرشم لیست از ستها درست میشه اما ما باید استریمی از String ها داشته باشیم و واسه همین از flatMap استفاده میکنیم :
Stream<Set<String>> booksStream = list.stream().map( s->s.getBook() ); Stream<String> booksStream = booksStream.flatMap(b->b.stream()); List<String> booksList = booksStream.collect(Collectors.toList()) ;
مرحله به مرحله ریختمشون تو متغیر که متوجه بشید تغییرات type رو.
سوالی بود اینجا یا توئیتر هستم.