рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ "
рдЬрд╛рд╡рд╛ 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);
рдкреНрд░рд╡рд╛рд╣ рдХреЗ рддрд░реАрдХреЗ
рдордзреНрдпрд╡рд░реНрддреА (рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ) рдФрд░
рдЯрд░реНрдорд┐рдирд▓ (рдЯрд░реНрдорд┐рдирд▓) рд╣реИрдВред рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдХ рдзрд╛рд░рд╛ рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рдЬреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐рдпрд╛рдБ рдпрд╛ рддреЛ рдПрдХ рдорд╛рди (рд╢реВрдиреНрдп) рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИрдВ рдпрд╛ рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
filter
,
map
рдФрд░
sorted
рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╣реИрдВ, рдФрд░
forEach
рдЯрд░реНрдорд┐рдирд▓ рд╣реИрдВред рдЙрдкрд▓рдмреНрдз рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП,
рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред рдзрд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдРрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдСрдкрд░реЗрд╢рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдПрдХ рд╕рд╛рде рдЧреИрд░-рджрдЦрд▓ рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
рдПрдХ рд╡рд┐рдзрд┐ рдЧреИрд░-рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд░рд╣реА рд╣реИ рдпрджрд┐ рдпрд╣ рдзрд╛рд░рд╛ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдИ рд▓рдВрдмреЛрджрд░ рднрд╛рд╡ рд╕реВрдЪреА рд╕рд░рдгреА myList рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд┐рдзрд┐ рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ рднреА рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░рд╕реНрдкрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЪрд░ рдпрд╛ рдмрд╛рд╣рд░реА рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдмрджрд▓ рд╕рдХрддреА рд╣реИред
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдзрд╛рдЧреЗ
рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реЗ рдзрд╛рд░рд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЕрдиреБрдХреНрд░рдорд┐рдХ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпрд╛рдБ рдФрд░ рд╕реЗрдЯ рдирдИ
stream()
рдФрд░
parllelStream()
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдореЛрдб (рдХрдИ рдереНрд░реЗрдбреНрд╕ рдкрд░) рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдореИрдиреБрдЕрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕ рдмреАрдЪ, рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
Arrays.asList("a1", "a2", "a3") .stream() .findFirst() .ifPresent(System.out::println);
рдпрд╣рд╛рдВ, рдХрд┐рд╕реА рд╕реВрдЪреА рдкрд░
stream()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:
Stream.of("a1", "a2", "a3") .findFirst() .ifPresent(System.out::println);
рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕
Stream.of()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ: int, long, doubleред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣
IntStream
,
LongStream
,
LongStream
ред
IntStream.range () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдиреНрдЯреНрд░реАрдореНрд░реАрдо рд╕реНрдЯреНрд░реАрдо (;;)
IntStream.range()
рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
IntStream.range(1, 4) .forEach(System.out::println);
рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рд╕рднреА рдзрд╛рд░рд╛рдПрдБ рд╡рд╕реНрддреБрдУрдВ рдХреА рдирд┐рдпрдорд┐рдд рдзрд╛рд░рд╛рдУрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ:
рдХрднреА-рдХрднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдЖрджрд┐рдо рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
mapToInt()
,
mapToLong()
,
mapToDouble()
:
Stream.of("a1", "a2", "a3") .map(s -> s.substring(1)) .mapToInt(Integer::parseInt) .max() .ifPresent(System.out::println);
рдЖрджрд┐рдорддрд╛ рдХреА рдзрд╛рд░рд╛рдУрдВ рдХреЛ
mapToObj()
рдХрд╣рдХрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
IntStream.range(1, 4) .mapToObj(i -> "a" + i) .forEach(System.out::println);
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Stream.of(1.0, 2.0, 3.0) .mapToInt(Double::intValue) .mapToObj(i -> "a" + i) .forEach(System.out::println);
рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢
рдЕрдм рдЬрдм рд╣рдордиреЗ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдзрд╛рд░рд╛рдПрдБ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ, рддреЛ рд╣рдо рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБрдЧреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рд╣реВрдб рдХреЗ рддрд╣рдд рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред
рдордзреНрдпрд╡рд░реНрддреА рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдирдХрд╛
рдЖрд▓рд╕реНрдп рд╣реИ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ:
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"); });
рдЬреИрд╕реЗ рд╣реА
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
рдФрд░
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));
рдЕрдм рдирдХреНрд╢рд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЬрдЯрд┐рд▓ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред
рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЙрд░реНрдЯ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рдХрд░ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рд╕реЙрд░реНрдЯ рдХреА рдЧрдИ рд╡рд┐рдзрд┐:
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));
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
sorted
рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
filter
рдПрдХ рддрддреНрд╡ рдореЗрдВ рдЗрдирдкреБрдЯ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдмрдбрд╝реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдХрд╛рдлреА рд▓рд╛рдн рд╣реЛрдЧрд╛ред
рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЬрд╛рд╡рд╛ 8 рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдереНрд░реЗрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
Stream<String> stream = Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> s.startsWith("a")); stream.anyMatch(s -> true);
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдкрд╡рд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж
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);
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);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░реАрдо рдЖрдЗрдЯрдо рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╕реВрдЪреА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдЪрд╛рд╣рд┐рдП?
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));
рдХрд▓реЗрдХреНрдЯрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд┐рдз рд╣реИрдВред рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рднреА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд╕рдд рдЖрдпреБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ:
Double averageAge = persons .stream() .collect(Collectors.averagingInt(p -> p.age)); System.out.println(averageAge);
рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо рдФрд░ рдФрд╕рдд рдорд╛рди, рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдпреЛрдЧ рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛:
IntSummaryStatistics ageSummary = persons .stream() .collect(Collectors.summarizingInt(p -> p.age)); System.out.println(ageSummary);
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рднреА рдирд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
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);
рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдХрд▓реЗрдХреНрдЯрд░ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рднреАред
рдХрд┐рд╕реА рд╕реНрдЯреНрд░реАрдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдПрдХ
IllegalStateException
рдорд┐рд▓рддреА рд╣реИред рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд░реНрдЬ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
Map<Integer, String> map = persons .stream() .collect(Collectors.toMap( p -> p.age, p -> p.name, (name1, name2) -> name1 + ";" + name2)); System.out.println(map);
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд┐рд░реНрдорд┐рдд рд╕рдВрдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдПред рдЖрдЗрдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдзрд╛рд░рд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрдЯреНрдЯреА рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдЕрдкрд░рдХреЗрд╕ рдирд╛рдо рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
Collector.of()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмрдирд╛рдПрдВред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЪрд╛рд░ рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛, рдмреИрдЯрд░реА, рдХрдиреЗрдХреНрдЯрд░, рдлрд┐рдирд┐рд╢рд░ред
Collector<Person, StringJoiner, String> personNameCollector = Collector.of( () -> new StringJoiner(" | "),
рдЪреВрдВрдХрд┐ 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<>();
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди
рдлреВ рдХреА рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рддреАрди
рдмрд╛рд░ рд╣реИрдВ ред
FlatMap
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ
рдлреВ рдХреЗ
рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
foos.stream() .flatMap(f -> f.bars.stream()) .forEach(b -> System.out.println(b.name));
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рддреАрди
рдлреВ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ 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);
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);
рддреАрд╕рд░рд╛
reduce
рд╡рд┐рдзрд┐ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрддреА рд╣реИ: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп, рджреНрд╡рд┐-рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рдпрдХ рдФрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдЬреИрд╕реЗ рд╕рдВрдпреЛрдЬрди рдлрд╝рдВрдХреНрд╢рдиред рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХреБрд▓ рдЬреАрд╡рд┐рдд рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Integer ageSum = persons .stream() .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2); System.out.println(ageSum);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо 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; });
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЪрдп рдХрд╛рд░реНрдп рд╕рднреА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкрд╣рд▓реЗ 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; });
рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рдЕрдм рдХрдВрдмрд╛рдЗрди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред , , -.
.
.
ForkJoinPool
ForkJoinPool.commonPool()
. 5 тАФ .
ForkJoinPool commonPool = ForkJoinPool.commonPool(); System.out.println(commonPool.getParallelism());
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 . , .