stream與Lambda結(jié)合使用(示列)

創(chuàng)建一個POJO對象

public class Person {
 
private String firstName, lastName, job, gender;
private int salary, age;
 
public Person(String firstName, String lastName, String job,
                String gender, int age, int salary)       {
          this.firstName = firstName;
          this.lastName = lastName;
          this.gender = gender;
          this.age = age;
          this.job = job;
          this.salary = salary;
}
// Getter and Setter 
// . . . . .
}

創(chuàng)建兩個list,都用來存放Person對象:

List<Person> javaProgrammers = new ArrayList<Person>() {
  {
    add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
    add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
    add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
    add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
    add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
    add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
    add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
    add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
    add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
    add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
  }
};
 
List<Person> phpProgrammers = new ArrayList<Person>() {
  {
    add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));
    add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));
    add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));
    add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));
    add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));
    add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));
    add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));
    add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));
    add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));
    add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));
  }
};

使用forEach方法來迭代輸出上述列表:

System.out.println("所有程序員的姓名:");
javaProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
phpProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

使用forEach方法,增加程序員的工資5%:

System.out.println("給程序員加薪 5% :");
Consumer<Person> giveRaise = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());
 
javaProgrammers.forEach(giveRaise);
phpProgrammers.forEach(giveRaise)

濾器filter() ,讓我們顯示月薪超過1400美元的PHP程序員:

System.out.println("下面是月薪超過 $1,400 的PHP程序員:")
phpProgrammers.stream()
          .filter((p) -> (p.getSalary() > 1400))
          .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

我們也可以定義過濾器,然后重用它們來執(zhí)行其他操作:

// 定義 filters
Predicate<Person> ageFilter = (p) -> (p.getAge() > 25);
Predicate<Person> salaryFilter = (p) -> (p.getSalary() > 1400);
Predicate<Person> genderFilter = (p) -> ("female".equals(p.getGender()));
 
System.out.println("下面是年齡大于 24歲且月薪在$1,400以上的女PHP程序員:");
phpProgrammers.stream()
          .filter(ageFilter)
          .filter(salaryFilter)
          .filter(genderFilter)
          .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
 
// 重用filters
System.out.println("年齡大于 24歲的女性 Java programmers:");
javaProgrammers.stream()
          .filter(ageFilter)
          .filter(genderFilter)
          .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

使用limit方法,可以限制結(jié)果集的個數(shù):

System.out.println("最前面的3個 Java programmers:");
javaProgrammers.stream()
          .limit(3)
          .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
 
 
System.out.println("最前面的3個女性 Java programmers:");
javaProgrammers.stream()
          .filter(genderFilter)
          .limit(3)
          .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
排序呢? 我們在stream中能處理嗎? 答案是肯定的。 在下面的例子中,我們將根據(jù)名字和薪水排序Java程序員,放到一個list中,然后顯示列表:
import static java.util.stream.Collectors.toList;

 

System.out.println("根據(jù) name 排序,并顯示前5個 Java programmers:");
List<Person> sortedJavaProgrammers = javaProgrammers
          .stream()
          .sorted((p, p2) -> (p.getFirstName().compareTo(p2.getFirstName())))
          .limit(5)
          .collect(toList());
 
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getFirstName(), p.getLastName()));
 
System.out.println("根據(jù) salary 排序 Java programmers:");
sortedJavaProgrammers = javaProgrammers
          .stream()
          .sorted( (p, p2) -> (p.getSalary() - p2.getSalary()) )
          .collect( toList() );
 
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getFirstName(), p.getLastName()));
如果我們只對最低和最高的薪水感興趣,比排序后選擇第一個/最后一個 更快的是min和max方法:
ystem.out.println("工資最低的 Java programmer:");
Person pers = javaProgrammers
          .stream()
          .min((p1, p2) -> (p1.getSalary() - p2.getSalary()))
          .get()

System.out.printf("Name: %s %s; Salary: $%,d.", pers.getFirstName(), pers.getLastName(), pers.getSalary())

System.out.println("工資最高的 Java programmer:");
Person person = javaProgrammers
          .stream()
          .max((p, p2) -> (p.getSalary() - p2.getSalary()))
          .get()

System.out.printf("Name: %s %s; Salary: $%,d.", person.getFirstName(), person.getLastName(), person.getSalary())
上面的例子中我們已經(jīng)看到 collect 方法是如何工作的。 結(jié)合 map 方法,我們可以使用 collect 方法來將我們的結(jié)果集放到一個字符串,一個 Set 或一個TreeSet中:
System.out.println("將 PHP programmers 的 first name 拼接成字符串:");
String phpDevelopers = phpProgrammers
          .stream()
          .map(Person::getFirstName)
          .collect(joining(" ; ")); // 在進(jìn)一步的操作中可以作為標(biāo)記(token)   
 
System.out.println("將 Java programmers 的 first name 存放到 Set:");
Set<String> javaDevFirstName = javaProgrammers
          .stream()
          .map(Person::getFirstName)
          .collect(toSet());
 
System.out.println("將 Java programmers 的 first name 存放到 TreeSet:");
TreeSet<String> javaDevLastName = javaProgrammers
          .stream()
          .map(Person::getLastName)
          .collect(toCollection(TreeSet::new));
Streams 還可以是并行的(parallel)轿塔。 示例如下:
System.out.println("計算付給 Java programmers 的所有money:");
int totalSalary = javaProgrammers
          .parallelStream()
          .mapToInt(p -> p.getSalary())
          .sum();
我們可以使用summaryStatistics方法獲得stream 中元素的各種匯總數(shù)據(jù)。 接下來,我們可以訪問這些方法,比如getMax, getMin, getSum或getAverage
//計算 count, min, max, sum, and average for numbers
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
IntSummaryStatistics stats = numbers
          .stream()
          .mapToInt((x) -> x)
          .summaryStatistics();
 
System.out.println("List中最大的數(shù)字 : " + stats.getMax());
System.out.println("List中最小的數(shù)字 : " + stats.getMin());
System.out.println("所有數(shù)字的總和   : " + stats.getSum());
System.out.println("所有數(shù)字的平均值 : " + stats.getAverage());
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末配并,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子高镐,更是在濱河造成了極大的恐慌溉旋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件避消,死亡現(xiàn)場離奇詭異低滩,居然都是意外死亡召夹,警方通過查閱死者的電腦和手機(jī)岩喷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門恕沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纱意,你說我怎么就攤上這事婶溯。” “怎么了偷霉?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵迄委,是天一觀的道長。 經(jīng)常有香客問我类少,道長叙身,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任硫狞,我火速辦了婚禮信轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘残吩。我一直安慰自己财忽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布泣侮。 她就那樣靜靜地躺著即彪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪活尊。 梳的紋絲不亂的頭發(fā)上隶校,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音蛹锰,去河邊找鬼深胳。 笑死,一個胖子當(dāng)著我的面吹牛宁仔,可吹牛的內(nèi)容都是我干的稠屠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼翎苫,長吁一口氣:“原來是場噩夢啊……” “哼权埠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煎谍,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤攘蔽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呐粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體满俗,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡转捕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唆垃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片五芝。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辕万,靈堂內(nèi)的尸體忽然破棺而出枢步,到底是詐尸還是另有隱情,我是刑警寧澤渐尿,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布醉途,位于F島的核電站,受9級特大地震影響砖茸,放射性物質(zhì)發(fā)生泄漏隘擎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一凉夯、第九天 我趴在偏房一處隱蔽的房頂上張望货葬。 院中可真熱鬧,春花似錦恍涂、人聲如沸宝惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼夺。三九已至,卻和暖如春炒瘸,著一層夾襖步出監(jiān)牢的瞬間淤堵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工顷扩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拐邪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓隘截,卻偏偏與公主長得像扎阶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子婶芭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容