рдмреЗрдВрдЬрд╛рдорд┐рди рд╡рд┐рдВрдЯрд░рдмрд░реНрдЧ рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдЧрд╛рдЗрдб рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ " рдЬрд╛рд╡рд╛ 8 рд╕реНрдЯреНрд░реАрдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ " рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдереА, рддреЛ рдореБрдЭреЗ рдирд╛рдо рд╕реЗ рд╣реИрд░рд╛рди рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ java.io рдкреИрдХреЗрдЬ рд╕реЗ InputStream рдФрд░ OutputStream рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╡реНрдпрдВрдЬрди рд╣реИ; рд╣рд╛рд▓рд╛рдБрдХрд┐, Java 8 рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред рдереНрд░реЗрдбреНрд╕ рдореЛрдирд╛рдб рд╣реИрдВ рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рдПрдХ рдореЛрдирд╛рдб рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдХреНрд░рдорд┐рдХ рдЪрд░рдгреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдореЛрдирд╛рдб рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдоред
рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдПрдЧрд╛ред рд╣рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреНрд░рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХреНрд░рдо рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ reduce , collect рдФрд░ flatMap ред рдореИрдиреБрдЕрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред

рдпрджрд┐ рдЖрдк рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕, рдлрдВрдХреНрд╢рдирд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рдореЗрдердбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8 (рд╣реЗрдмрд░реЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж ), рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрдЯрдбреА рдлреНрд▓реЛ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдЧрд╛рдЗрдб рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдзрд╛рдЧреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ


рдПрдХ рдзрд╛рд░рд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрди рддрддреНрд╡реЛрдВ рдкрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ:

 List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1"); myList .stream() .filter(s -> s.startsWith("c")) .map(String::toUpperCase) .sorted() .forEach(System.out::println); // C1 // C2 

рдкреНрд░рд╡рд╛рд╣ рдХреЗ рддрд░реАрдХреЗ рдордзреНрдпрд╡рд░реНрддреА (рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ) рдФрд░ рдЯрд░реНрдорд┐рдирд▓ (рдЯрд░реНрдорд┐рдирд▓) рд╣реИрдВред рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдХ рдзрд╛рд░рд╛ рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рдЬреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐рдпрд╛рдБ рдпрд╛ рддреЛ рдПрдХ рдорд╛рди (рд╢реВрдиреНрдп) рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИрдВ рдпрд╛ рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, filter , map рдФрд░ sorted рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╣реИрдВ, рдФрд░ forEach рдЯрд░реНрдорд┐рдирд▓ рд╣реИрдВред рдЙрдкрд▓рдмреНрдз рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред рдзрд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдРрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдСрдкрд░реЗрд╢рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдПрдХ рд╕рд╛рде рдЧреИрд░-рджрдЦрд▓ рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдПрдХ рд╡рд┐рдзрд┐ рдЧреИрд░-рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд░рд╣реА рд╣реИ рдпрджрд┐ рдпрд╣ рдзрд╛рд░рд╛ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдИ рд▓рдВрдмреЛрджрд░ рднрд╛рд╡ рд╕реВрдЪреА рд╕рд░рдгреА myList рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд┐рдзрд┐ рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ рднреА рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░рд╕реНрдкрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЪрд░ рдпрд╛ рдмрд╛рд╣рд░реА рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдмрджрд▓ рд╕рдХрддреА рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдзрд╛рдЧреЗ


рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реЗ рдзрд╛рд░рд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЕрдиреБрдХреНрд░рдорд┐рдХ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпрд╛рдБ рдФрд░ рд╕реЗрдЯ рдирдИ stream() рдФрд░ parllelStream() рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдореЛрдб (рдХрдИ рдереНрд░реЗрдбреНрд╕ рдкрд░) рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдореИрдиреБрдЕрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕ рдмреАрдЪ, рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 Arrays.asList("a1", "a2", "a3") .stream() .findFirst() .ifPresent(System.out::println); // a1 

рдпрд╣рд╛рдВ, рдХрд┐рд╕реА рд╕реВрдЪреА рдкрд░ stream() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:

 Stream.of("a1", "a2", "a3") .findFirst() .ifPresent(System.out::println); // a1 

рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ Stream.of() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ: int, long, doubleред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ IntStream , LongStream , LongStream ред

IntStream.range () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдиреНрдЯреНрд░реАрдореНрд░реАрдо рд╕реНрдЯреНрд░реАрдо (;;) IntStream.range() рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

 IntStream.range(1, 4) .forEach(System.out::println); // 1 // 2 // 3 

рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рд╕рднреА рдзрд╛рд░рд╛рдПрдБ рд╡рд╕реНрддреБрдУрдВ рдХреА рдирд┐рдпрдорд┐рдд рдзрд╛рд░рд╛рдУрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ:

  • рдЖрджрд┐рдо рдзрд╛рд░рд╛рдПрдБ рд╡рд┐рд╢реЗрд╖ рд▓рдВрдмреЛрджрд░ рднрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп IntFunction, рдпрд╛ Predicate рдХреЗ рдмрдЬрд╛рдп IntPredicateред
  • рдЖрджрд┐рдо рдзрд╛рд░рд╛рдПрдБ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВ: sum() рдФрд░ average()

     Arrays.stream(new int[] {1, 2, 3}) .map(n -> 2 * n + 1) .average() .ifPresent(System.out::println); // 5.0 


рдХрднреА-рдХрднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдЖрджрд┐рдо рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: mapToInt() , mapToLong() , mapToDouble() :

 Stream.of("a1", "a2", "a3") .map(s -> s.substring(1)) .mapToInt(Integer::parseInt) .max() .ifPresent(System.out::println); // 3 

рдЖрджрд┐рдорддрд╛ рдХреА рдзрд╛рд░рд╛рдУрдВ рдХреЛ mapToObj() рдХрд╣рдХрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 IntStream.range(1, 4) .mapToObj(i -> "a" + i) .forEach(System.out::println); // a1 // a2 // a3 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 Stream.of(1.0, 2.0, 3.0) .mapToInt(Double::intValue) .mapToObj(i -> "a" + i) .forEach(System.out::println); // a1 // a2 // a3 

рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢


рдЕрдм рдЬрдм рд╣рдордиреЗ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдзрд╛рд░рд╛рдПрдБ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ, рддреЛ рд╣рдо рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБрдЧреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рд╣реВрдб рдХреЗ рддрд╣рдд рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред

рдордзреНрдпрд╡рд░реНрддреА рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдирдХрд╛ рдЖрд▓рд╕реНрдп рд╣реИ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ:

 Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> { System.out.println("filter: " + s); return true; }); 

рдЬрдм рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреБрдЫ рднреА рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рд╣реЛред рдЖрдЗрдП forEach рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ:

 Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> { System.out.println("filter: " + s); return true; }) .forEach(s -> System.out.println("forEach: " + s)); 

рдЗрд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

 filter: d2 forEach: d2 filter: a2 forEach: a2 filter: b1 forEach: b1 filter: b3 forEach: b3 filter: c forEach: c 

рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ "рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдзрд╛рд░рд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рддрддреНрд╡ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде "рд▓рдВрдмрд╡рдд" рдЪрд▓рддрд╛ рд╣реИред рдкрд╣рд▓реЗ, "d2" рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ filter рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ, рдлрд┐рд░ forEach рдорд╛рдзреНрдпрдо рд╕реЗ forEach рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЧрд▓рд╛ рддрддреНрд╡ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рд╕рдВрдЪрд╛рд▓рди рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Stream.of("d2", "a2", "b1", "b3", "c") .map(s -> { System.out.println("map: " + s); return s.toUpperCase(); }) .anyMatch(s -> { System.out.println("anyMatch: " + s); return s.startsWith("A"); }); // map: d2 // anyMatch: D2 // map: a2 // anyMatch: A2 

рдЬреИрд╕реЗ рд╣реА anyMatch рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ рд╡реИрд╕реЗ рд╣реА рдХреЛрдИ рднреА anyMatch рд╡рд┐рдзрд┐ рд╕рд╣реА рд╣реЛ рдЬрд╛рдПрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╣реИ - "рдП 2"ред рддрджрдиреБрд╕рд╛рд░, рдзрд╛рдЧрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ "рдКрд░реНрдзреНрд╡рд╛рдзрд░" рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХрд╛рд░рдг, map рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдзрд╛рд░рд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, map рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдиреБрдХреНрд░рдо рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЛ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдзрд┐ map рдФрд░ filter рдФрд░ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ forEach ред рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ рдпреЗ рддрд░реАрдХреЗ рдХреИрд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

 Stream.of("d2", "a2", "b1", "b3", "c") .map(s -> { System.out.println("map: " + s); return s.toUpperCase(); }) .filter(s -> { System.out.println("filter: " + s); return s.startsWith("A"); }) .forEach(s -> System.out.println("forEach: " + s)); // map: d2 // filter: D2 // map: a2 // filter: A2 // forEach: A2 // map: b1 // filter: B1 // map: b3 // filter: B3 // map: c // filter: C 

рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ map рдФрд░ filter рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ 5 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдмрд╛рд░ рд╕реНрд░реЛрдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ forEach рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ - рдлрд┐рд▓реНрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд╣рд▓реА рдмрд╛рд░ filter рд▓рдЧрд╛рдХрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдХрд░ рдЖрдк рдСрдкрд░реЗрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> { System.out.println("filter: " + s); return s.startsWith("a"); }) .map(s -> { System.out.println("map: " + s); return s.toUpperCase(); }) .forEach(s -> System.out.println("forEach: " + s)); // filter: d2 // filter: a2 // map: a2 // forEach: A2 // filter: b1 // filter: b3 // filter: c 

рдЕрдм рдирдХреНрд╢рд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЬрдЯрд┐рд▓ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред

рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЙрд░реНрдЯ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рдХрд░ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рд╕реЙрд░реНрдЯ рдХреА рдЧрдИ рд╡рд┐рдзрд┐:

 Stream.of("d2", "a2", "b1", "b3", "c") .sorted((s1, s2) -> { System.out.printf("sort: %s; %s\n", s1, s2); return s1.compareTo(s2); }) .filter(s -> { System.out.println("filter: " + s); return s.startsWith("a"); }) .map(s -> { System.out.println("map: " + s); return s.toUpperCase(); }) .forEach(s -> System.out.println("forEach: " + s)); 

рдЫрдБрдЯрд╛рдИ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рди рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рд╕реНрдЯреЗрдЯрдлреБрд▓ рдСрдкрд░реЗрд╢рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 sort: a2; d2 sort: b1; a2 sort: b1; d2 sort: b1; a2 sort: b3; b1 sort: b3; d2 sort: c; b3 sort: c; d2 filter: a2 map: a2 forEach: A2 filter: b1 filter: b3 filter: c filter: d2 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, sorted рд╡рд┐рдзрд┐ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдЪрд▓рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд╡рдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдХрдИ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП 8 рдмрд╛рд░ sorted рд╣реИред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ:

 Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> { System.out.println("filter: " + s); return s.startsWith("a"); }) .sorted((s1, s2) -> { System.out.printf("sort: %s; %s\n", s1, s2); return s1.compareTo(s2); }) .map(s -> { System.out.println("map: " + s); return s.toUpperCase(); }) .forEach(s -> System.out.println("forEach: " + s)); // filter: d2 // filter: a2 // filter: b1 // filter: b3 // filter: c // map: a2 // forEach: A2 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, sorted рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред filter рдПрдХ рддрддреНрд╡ рдореЗрдВ рдЗрдирдкреБрдЯ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдмрдбрд╝реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдХрд╛рдлреА рд▓рд╛рдн рд╣реЛрдЧрд╛ред

рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЬрд╛рд╡рд╛ 8 рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдереНрд░реЗрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 Stream<String> stream = Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> s.startsWith("a")); stream.anyMatch(s -> true); // ok stream.noneMatch(s -> true); // exception 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдкрд╡рд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж anyMatch рдХреЛ рдХреЙрд▓ noneMatch

 java.lang.IllegalStateException: stream has already been operated upon or closed at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229) at java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:459) at com.winterbe.java8.Streams5.test7(Streams5.java:38) at com.winterbe.java8.Streams5.main(Streams5.java:28) 

рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдирдП рдереНрд░реЗрдб рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдкреНрд▓рд╛рдпрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рддрд░реАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:

 Supplier<Stream<String>> streamSupplier = () -> Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> s.startsWith("a")); streamSupplier.get().anyMatch(s -> true); // ok streamSupplier.get().noneMatch(s -> true); // ok 

get рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдиреНрдирдд рддрд░реАрдХреЗ


рдереНрд░реЗрдб рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред рдФрд░ рдЕрдм рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЛрдВ рдореЗрдВ рднреА рдЧрд╣рд░рд╛ рдЧреЛрддрд╛ flatMap : collect , flatMap рдФрд░ reduce ред

рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдСрдкрд░реЗрд╢рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ:

 class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name; } } List<Person> persons = Arrays.asList( new Person("Max", 18), new Person("Peter", 23), new Person("Pamela", 23), new Person("David", 12)); 

рдХрд▓реЗрдХреНрдЯ


Collect рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреНрд░реАрдо рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪреА, рд╕реЗрдЯ рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ред

Collector рдПрдХ Collector рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ: рдПрдХ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ред рд╕рдВрдЪрд╛рдпрдХ, рдХрдВрдШреА, рдлрд┐рдирд┐рд╢рд░ред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ 8 рдХрд▓реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд▓реЗрдХреНрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╛рдорд▓рд╛:

 List<Person> filtered = persons .stream() .filter(p -> p.name.startsWith("P")) .collect(Collectors.toList()); System.out.println(filtered); // [Peter, Pamela] 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░реАрдо рдЖрдЗрдЯрдо рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╕реВрдЪреА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдЪрд╛рд╣рд┐рдП? Collectors.toSet() рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ Collectors.toSet() ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрдпреБ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 Map<Integer, List<Person>> personsByAge = persons .stream() .collect(Collectors.groupingBy(p -> p.age)); personsByAge .forEach((age, p) -> System.out.format("age %s: %s\n", age, p)); // age 18: [Max] // age 23: [Peter, Pamela] // age 12: [David] 

рдХрд▓реЗрдХреНрдЯрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд┐рдз рд╣реИрдВред рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рднреА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд╕рдд рдЖрдпреБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ:

 Double averageAge = persons .stream() .collect(Collectors.averagingInt(p -> p.age)); System.out.println(averageAge); // 19.0 

рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо рдФрд░ рдФрд╕рдд рдорд╛рди, рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдпреЛрдЧ рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛:

 IntSummaryStatistics ageSummary = persons .stream() .collect(Collectors.summarizingInt(p -> p.age)); System.out.println(ageSummary); // IntSummaryStatistics{count=4, sum=76, min=12, average=19.000000, max=23} 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рднреА рдирд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

 String phrase = persons .stream() .filter(p -> p.age >= 18) .map(p -> p.name) .collect(Collectors.joining(" and ", "In Germany ", " are of legal age.")); System.out.println(phrase); // In Germany Max and Peter and Pamela are of legal age. 

рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдХрд▓реЗрдХреНрдЯрд░ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рднреАред

рдХрд┐рд╕реА рд╕реНрдЯреНрд░реАрдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдПрдХ IllegalStateException рдорд┐рд▓рддреА рд╣реИред рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд░реНрдЬ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 Map<Integer, String> map = persons .stream() .collect(Collectors.toMap( p -> p.age, p -> p.name, (name1, name2) -> name1 + ";" + name2)); System.out.println(map); // {18=Max, 23=Peter;Pamela, 12=David} 

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд┐рд░реНрдорд┐рдд рд╕рдВрдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдПред рдЖрдЗрдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдзрд╛рд░рд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрдЯреНрдЯреА рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдЕрдкрд░рдХреЗрд╕ рдирд╛рдо рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Collector.of() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмрдирд╛рдПрдВред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЪрд╛рд░ рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛, рдмреИрдЯрд░реА, рдХрдиреЗрдХреНрдЯрд░, рдлрд┐рдирд┐рд╢рд░ред

 Collector<Person, StringJoiner, String> personNameCollector = Collector.of( () -> new StringJoiner(" | "), // supplier (j, p) -> j.add(p.name.toUpperCase()), // accumulator (j1, j2) -> j1.merge(j2), // combiner StringJoiner::toString); // finisher String names = persons .stream() .collect(personNameCollector); System.out.println(names); // MAX | PETER | PAMELA | DAVID 

рдЪреВрдВрдХрд┐ Java рдореЗрдВ рддрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рд╣рдореЗрдВ StringJoiner рдЬреИрд╕реЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреА StringJoiner рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдкреНрд░рджрд╛рддрд╛ рдПрдХ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде StringJoiner рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред StringJoiner рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрдиреЗрдХреНрдЯрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдореЗрдВ рджреЛ StringJoiner рдХреЛ рдХреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ StringJoiner ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдлрд┐рдирд┐рд╢рд░ StringJoiner s рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред

FlatMap


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ map рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред Map рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд┐рдд рд╡рд┐рдзрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ flatMap рд╡рд┐рдзрд┐ рдорджрдж рдХрд░рддреА рд╣реИред FlatMap рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рдЗрди рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ flatMap рд╡рд┐рдзрд┐ рдХреА рд▓реМрдЯреА рд╣реБрдИ рдзрд╛рд░рд╛ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ flatMap рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

 class Foo { String name; List<Bar> bars = new ArrayList<>(); Foo(String name) { this.name = name; } } class Bar { String name; Bar(String name) { this.name = name; } } 

рдЖрдЗрдП рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

 List<Foo> foos = new ArrayList<>(); // create foos IntStream .range(1, 4) .forEach(i -> foos.add(new Foo("Foo" + i))); // create bars foos.forEach(f -> IntStream .range(1, 4) .forEach(i -> f.bars.add(new Bar("Bar" + i + " <- " + f.name)))); 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдлреВ рдХреА рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рддреАрди рдмрд╛рд░ рд╣реИрдВ ред

FlatMap рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдлреВ рдХреЗ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 foos.stream() .flatMap(f -> f.bars.stream()) .forEach(b -> System.out.println(b.name)); // Bar1 <- Foo1 // Bar2 <- Foo1 // Bar3 <- Foo1 // Bar1 <- Foo2 // Bar2 <- Foo2 // Bar3 <- Foo2 // Bar1 <- Foo3 // Bar2 <- Foo3 // Bar3 <- Foo3 

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рддреАрди рдлреВ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ 9 рдмрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб рдХреЛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рд╕рд░рд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 IntStream.range(1, 4) .mapToObj(i -> new Foo("Foo" + i)) .peek(f -> IntStream.range(1, 4) .mapToObj(i -> new Bar("Bar" + i + " <- " f.name)) .forEach(f.bars::add)) .flatMap(f -> f.bars.stream()) .forEach(b -> System.out.println(b.name)); 

FlatMap рдЬрд╛рд╡рд╛ 8. рдореЗрдВ рд╢реБрд░реВ рдХреА рдЧрдИ Optional рд╡рд░реНрдЧ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред Optional рд╡рд░реНрдЧ рд╕реЗ FlatMap рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ null рдЬрд╛рдВрдЪреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:

 class Outer { Nested nested; } class Nested { Inner inner; } class Inner { String foo; } 

рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ NullPointException рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ null рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 Outer outer = new Outer(); if (outer != null && outer.nested != null && outer.nested.inner != null) { System.out.println(outer.nested.inner.foo); } 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдлреНрд▓реИрдЯрдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 Optional.of(new Outer()) .flatMap(o -> Optional.ofNullable(o.nested)) .flatMap(n -> Optional.ofNullable(n.inner)) .flatMap(i -> Optional.ofNullable(i.foo)) .ifPresent(System.out::println); 

flatMap рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ Optional рдЖрд╡рд░рдг рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдореМрдЬреВрдж рд╣реИ, рдпрд╛ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧрд╛рдпрдм рд╣реИ рддреЛ null рд╣реИред

рдХрдо рдХрд░реЗрдВ


рд╕рд░рд▓реАрдХрд░рдг рдСрдкрд░реЗрд╢рди рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ 8 рдХрдо рдХрд░рдиреЗ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╡рд╛рд╣ рддрддреНрд╡ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡ рдХреЛ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЙрдореНрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ:

 persons .stream() .reduce((p1, p2) -> p1.age > p2.age ? p1 : p2) .ifPresent(System.out::println); // Pamela 

reduce рд╡рд┐рдзрд┐ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдСрдкрд░реЗрдЯрд░ (рдмрд╛рдЗрдирд░реАрдСрдкрд░реЗрдЯрд░) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЪрдп рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред рдпрд╣рд╛рдВ reduce рдПрдХ рджреНрд╡рд┐-рдлрд╝рдВрдХреНрд╢рди (BiFunction) рд╣реИ, рдЬрд╣рд╛рдВ рджреЛрдиреЛрдВ рддрд░реНрдХ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред рдПрдХ рджреНрд╡рд┐-рдлрд╝рдВрдХреНрд╢рди рд▓рдЧрднрдЧ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ 2 рддрд░реНрдХ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рджреЛ рд▓реЛрдЧреЛрдВ рдХреА рдЙрдореНрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЖрдпреБ рдХреЗ рд╕рд╛рде рдПрдХ рддрддреНрд╡ рджреЗрддрд╛ рд╣реИред

reduce рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдЧрд▓рд╛ рд░реВрдк рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдФрд░ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдмреИрдЯрд░реА рджреЛрдиреЛрдВ рд▓реЗрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ - рдПрдХ рдирд╛рдо рдФрд░ рдЙрдореНрд░ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ , рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдирд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдпреЛрдЧ рд░рд╣рддрд╛ рд╣реИ:

 Person result = persons .stream() .reduce(new Person("", 0), (p1, p2) -> { p1.age += p2.age; p1.name += p2.name; return p1; }); System.out.format("name=%s; age=%s", result.name, result.age); // name=MaxPeterPamelaDavid; age=76 

рддреАрд╕рд░рд╛ reduce рд╡рд┐рдзрд┐ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрддреА рд╣реИ: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп, рджреНрд╡рд┐-рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рдпрдХ рдФрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдЬреИрд╕реЗ рд╕рдВрдпреЛрдЬрди рдлрд╝рдВрдХреНрд╢рдиред рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХреБрд▓ рдЬреАрд╡рд┐рдд рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Integer ageSum = persons .stream() .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2); System.out.println(ageSum); // 76 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо 76 рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реБрдб рдХреЗ рддрд╣рдд рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рд╣рдо рдбрд┐рдмрдЧ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

 Integer ageSum = persons .stream() .reduce(0, (sum, p) -> { System.out.format("accumulator: sum=%s; person=%s\n", sum, p); return sum += p.age; }, (sum1, sum2) -> { System.out.format("combiner: sum1=%s; sum2=%s\n", sum1, sum2); return sum1 + sum2; }); // accumulator: sum=0; person=Max // accumulator: sum=18; person=Peter // accumulator: sum=41; person=Pamela // accumulator: sum=64; person=David 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЪрдп рдХрд╛рд░реНрдп рд╕рднреА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкрд╣рд▓реЗ 0 рдХреЗ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рдФрд░ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдореИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ, рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрдпреБ рдЕрдВрддрд┐рдо рдЪрд░рдг рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ 76 рд╡рд░реНрд╖ рдХреА рдЖрдпреБ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ред

рддреЛ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдХрдВрдмрд╛рдЗрди рдХреЛ рдХрднреА рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 Integer ageSum = persons .parallelStream() .reduce(0, (sum, p) -> { System.out.format("accumulator: sum=%s; person=%s\n", sum, p); return sum += p.age; }, (sum1, sum2) -> { System.out.format("combiner: sum1=%s; sum2=%s\n", sum1, sum2); return sum1 + sum2; }); // accumulator: sum=0; person=Pamela // accumulator: sum=0; person=David // accumulator: sum=0; person=Max // accumulator: sum=0; person=Peter // combiner: sum1=18; sum2=23 // combiner: sum1=23; sum2=12 // combiner: sum1=41; sum2=35 

рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рдЕрдм рдХрдВрдмрд╛рдЗрди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред , , -.

.


. ForkJoinPool ForkJoinPool.commonPool() . 5 тАФ .

 ForkJoinPool commonPool = ForkJoinPool.commonPool(); System.out.println(commonPool.getParallelism()); // 3 

3 . JVM:

 -Djava.util.concurrent.ForkJoinPool.common.parallelism=5 

parallelStream() . parallel() .

, (thread) System.out :

 Arrays.asList("a1", "a2", "b1", "c2", "c1") .parallelStream() .filter(s -> { System.out.format("filter: %s [%s]\n", s, Thread.currentThread().getName()); return true; }) .map(s -> { System.out.format("map: %s [%s]\n", s, Thread.currentThread().getName()); return s.toUpperCase(); }) .forEach(s -> System.out.format("forEach: %s [%s]\n", s, Thread.currentThread().getName())); 

, (thread) (stream):

 filter: b1 [main] filter: a2 [ForkJoinPool.commonPool-worker-1] map: a2 [ForkJoinPool.commonPool-worker-1] filter: c2 [ForkJoinPool.commonPool-worker-3] map: c2 [ForkJoinPool.commonPool-worker-3] filter: c1 [ForkJoinPool.commonPool-worker-2] map: c1 [ForkJoinPool.commonPool-worker-2] forEach: C2 [ForkJoinPool.commonPool-worker-3] forEach: A2 [ForkJoinPool.commonPool-worker-1] map: b1 [main] forEach: B1 [main] filter: a1 [ForkJoinPool.commonPool-worker-3] map: a1 [ForkJoinPool.commonPool-worker-3] forEach: A1 [ForkJoinPool.commonPool-worker-3] forEach: C1 [ForkJoinPool.commonPool-worker-2] 

, (threads) ForkJoinPool . , (thread).

sort :

 Arrays.asList("a1", "a2", "b1", "c2", "c1") .parallelStream() .filter(s -> { System.out.format("filter: %s [%s]\n", s, Thread.currentThread().getName()); return true; }) .map(s -> { System.out.format("map: %s [%s]\n", s, Thread.currentThread().getName()); return s.toUpperCase(); }) .sorted((s1, s2) -> { System.out.format("sort: %s <> %s [%s]\n", s1, s2, Thread.currentThread().getName()); return s1.compareTo(s2); }) .forEach(s -> System.out.format("forEach: %s [%s]\n", s, Thread.currentThread().getName())); 

:

 filter: c2 [ForkJoinPool.commonPool-worker-3] filter: c1 [ForkJoinPool.commonPool-worker-2] map: c1 [ForkJoinPool.commonPool-worker-2] filter: a2 [ForkJoinPool.commonPool-worker-1] map: a2 [ForkJoinPool.commonPool-worker-1] filter: b1 [main] map: b1 [main] filter: a1 [ForkJoinPool.commonPool-worker-2] map: a1 [ForkJoinPool.commonPool-worker-2] map: c2 [ForkJoinPool.commonPool-worker-3] sort: A2 <> A1 [main] sort: B1 <> A2 [main] sort: C2 <> B1 [main] sort: C1 <> C2 [main] sort: C1 <> B1 [main] sort: C1 <> C2 [main] forEach: A1 [ForkJoinPool.commonPool-worker-1] forEach: C2 [ForkJoinPool.commonPool-worker-3] forEach: B1 [main] forEach: A2 [ForkJoinPool.commonPool-worker-2] forEach: C1 [ForkJoinPool.commonPool-worker-1] 

, sort main . sort Stream API Arrays , Java 8, тАФ Arrays.parallelSort() . , , тАФ :
тАЬтАЭ, Arrays.sort.
reduce . , . , :

 List<Person> persons = Arrays.asList( new Person("Max", 18), new Person("Peter", 23), new Person("Pamela", 23), new Person("David", 12)); persons .parallelStream() .reduce(0, (sum, p) -> { System.out.format("accumulator: sum=%s; person=%s [%s]\n", sum, p, Thread.currentThread().getName()); return sum += p.age; }, (sum1, sum2) -> { System.out.format("combiner: sum1=%s; sum2=%s [%s]\n", sum1, sum2, Thread.currentThread().getName()); return sum1 + sum2; }); 

, : , , :

 accumulator: sum=0; person=Pamela; [main] accumulator: sum=0; person=Max; [ForkJoinPool.commonPool-worker-3] accumulator: sum=0; person=David; [ForkJoinPool.commonPool-worker-2] accumulator: sum=0; person=Peter; [ForkJoinPool.commonPool-worker-1] combiner: sum1=18; sum2=23; [ForkJoinPool.commonPool-worker-1] combiner: sum1=23; sum2=12; [ForkJoinPool.commonPool-worker-2] combiner: sum1=41; sum2=35; [ForkJoinPool.commonPool-worker-2] 

, . , ( ), .

, ForkJoinPool , JVM. , (threads), .


Java 8 . . , , (Martin Fowler) Collection Pipelines .

JavaScript, Stream.js тАФ JavaScript Java 8 Streams API. , Java 8 Tutorial ( ) Java 8 Nashorn Tutorial .

, , . GitHub . , .

Source: https://habr.com/ru/post/hi437038/


All Articles