рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЗрдЦред рдФрд░ рдмрд╕ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдордд рдШреБрдорд╛рдУ рдФрд░ рдХрд░реНрдХрд╢ рдЖрд╡рд╛рдЬрд╝ рдореЗрдВ рдЬрд╝реЛрд░ рд╕реЗ рдмреЛрд▓реЛ - "рдареАрдХ рд╣реИ, рдЖрдк рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ ... рдПрд╣?" рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рдЭреБрдВрдб рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдмрди рдкреЗрдкрд░ рдХреА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд▓рдЧ рд╕рдХрддреА рд╣реИрдВ ... рдЕрдЬреАрдм рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдЪрд┐рдд, рдЬреИрд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╣рд╛рд╕реНрдпред
рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЛ рджрд┐рд▓ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рдЖрдкрдХреА рд╕реБрдмрд╣ рдХреА рдХреЙрдлреА рдореЗрдВ рдмреИрдХрдкреЗрдХреНрдЪрд░ рд╣реЛ, рдЕрдЧрд░ рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЗрди рдкреЗрди рд╕реЗ рдЫреВрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕, рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХрд┐рд╕реА рдиреЗ рдЙрдЬреНрдЬреНрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдФрд░ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕рдВрднреЛрдЧ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЗрдВрдХрдЬреЗрдЯ, рдпрд╣рд╛рдБ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕рдм рдХреБрдЫ рддрдп рдХрд░рддреА рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде, рдмреЗрд╢рдХ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рдореЗрдВ рдирдИ рддрдХрдиреАрдХ рдореЗрдВ рд░реБрдЪрд┐ рдкреИрджрд╛ рдХреАред
рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рдКрдВрдЪрд╛рдИ рдирд┐рд░рдкреЗрдХреНрд╖ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реИрдВ ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рдмреНрдж рд░рд╛рдЬрдиреАрддрд┐рдХ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рд▓реЗрдЦрдХ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рдмрдВрдж рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдкреВрд░реЗ рджрд┐рди рдмреИрдарддрд╛ рд╣реИред рдпрд╣ рд░рд╛рдд рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рджрд┐рди рдореЗрдВ рддреАрди рд╣реБрдХреНрдХрд╛ рдкреАрддрд╛ рд╣реИ рдФрд░ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рджреЛ рдмрд╛рд░ рдмрд╛рд╣рд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЗ рдЪрд┐рдХрд┐рддреНрд╕рдХ рд╕реЗ рдорд┐рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ - IKEAред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреБрд░рд╛рдиреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ:
int result = 1 + 2 * 4;
рдФрд░ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд╣реАрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдХреЛрдИ рднреА рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд╣реА рджрд┐рдорд╛рдЧ рдореЗрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдХреЛрдИ рдирд╣реАрдВред рдЕрдкрдиреЗ рд╕рд╣реА рджрд┐рдорд╛рдЧ рдореЗрдВ
Mono<Integer> result = Flux.concat( Mono.just(1), Flux.concat(Mono.just(2), Mono.just(4)) .reduce((a, b) -> a * b)) .reduce((a, b) -> a + b); StepVerifier.create(result) .expectNext(9) .expectComplete() .verify();
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ! рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛, рдПрдХ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдЧреБрдгрд╛ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдореБрдЭреЗ rSocket
рдФрд░ kafka
рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╡реИрд╕реЗ, рдпрд╣ рдПрдХ рд╡рд╛рд░реНрдо-рдЕрдк рдерд╛ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВ, рдореИрдВ рджреЛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рд╕рд▓рд╛рд╣: рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕рд╣рдХрд░реНрдореА рдмрдЪреНрдЪреЛрдВ рдХреЗ рдкрд░рд┐рд╕рд░реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреАрдорд╛рд░ рдордиреЛрд░реЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░ рдЫрдкреЗрдВрдЧреЗ, рд╕рд░реНрд╡реЛрддреНрддрдо рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдирд╣реАрдВ, рдФрд░ рдмрд╣реБрдд рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рдиред
рдЯрд┐рдк рджреЛред рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ d% & @ a рд╕реЗ рджреВрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг
рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдФрд░ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ... рдкреЗрдбрд╝ред рдХреНрдпреЛрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдкреЗрдбрд╝ рдСрдХреНрд╕реАрдЬрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рдВрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдИ рдЬрд╛рдирд╡рд░ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдЪрдп рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ (рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдПрдХ рдкрд╛рд░реНрдХ рдпрд╛ рд╡рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЬрд╛рдирд╡рд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреЗрдШрд░ рд▓реЛрдЧ, рдХрд╛рд░реНрдбрдмреЛрд░реНрдб рдмрдХреНрд╕реЗ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рдереЗред
рд╡реИрд╕реЗ, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп, рдкреНрд░рд╛рдЪреАрди рдХрд╛рд▓ рд╕реЗ, рдорд╛рдирд╡ рдЬрд╛рддрд┐ рдкреЗрдбрд╝реЛрдВ рд╕реЗ рдорд╛рдирд╡ рдЬреАрд╡рди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд░рд╣реА рд╣реИ - рд▓рдХрдбрд╝реАред рдЬрд╝рд░рд╛ рд╕реЛрдЪрд┐рдП, рдЙрди рд╕рднреА рдЫрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЬреЛ рд╣рдо рдЕрдкрдиреЗ рдЬреАрд╡рди рднрд░ рдЕрдкрдиреЗ рдкрд╣рд┐рдпреЛрдВ рдореЗрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрд╛рдХреА рд╕рднреА рдХреЛ рджреЛрд╖ рджреЗрддреЗ рд╣реИрдВ, рд▓рдХрдбрд╝реА рдХреЗ рдмрдиреЗ рднреАред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреЗрдбрд╝ рд╣реИ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг, рдирд┐рд╣рддреНрдерд╛ рдкреЗрдбрд╝ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд▓реЙрди рдореЗрдВ рдЙрдЧрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рджрд┐рди рдмрдбрд╝рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕рдкрдиреЗ рджреЗрдЦрддрд╛ рд╣реИ, BST рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
public class TreeNode { public int val; public TreeNode left, right; public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } public TreeNode(int val) { this(val, null, null); }
рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЛрдорд╡рд╛рд░ рдХреЛ рд╕реБрдмрд╣ рдЫрд╣ рдмрдЬреЗ, рдПрдХ рд░рд╛рдд рдХреА рдиреАрдВрдж рдХреЗ рдмрд╛рдж, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдФрд░ рдЙрд╕рдиреЗ рдХрд░ рджрд┐рдЦрд╛рдпрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХрд╛рдо рдХрд╛ рдЖрджрдореА рд╣реИред
public class TreeNode { public final Mono<Integer> value; public final Mono<TreeNode> left; public final Mono<TreeNode> right; public TreeNode(Mono<Integer> value, Mono<TreeNode> left, Mono<TreeNode> right) { this.value = value; this.left = left; this.right = right; } public TreeNode(int value, TreeNode left, TreeNode right) { this(Mono.just(value), Mono.justOrEmpty(left), Mono.justOrEmpty(right)); } public TreeNode(int value) { this(Mono.just(value), Mono.empty(), Mono.empty()); } public Flux<TreeNode> flux() { return Flux.concat( left.flatMapMany(TreeNode::flux), Mono.just(this), right.flatMapMany(TreeNode::flux) ); } @Override public String toString() { return flux() .flatMap(n -> n.value) .collectList() .map(Object::toString) .block(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TreeNode treeNode = (TreeNode) o; return Objects.equals(value.block(), treeNode.value.block()); } @Override public int hashCode() { return value.block(); }
рдЖрдк рд╣рд╡рд╛ рдореЗрдВ рд▓рдЯрдХрд╛ рд╕рд╡рд╛рд▓ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ - "рдХреНрдпреЛрдВ?"ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реБрдВрджрд░ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЕрдиреБрдХреВрд▓ рднреА рд╣реИ рдФрд░ рдЧреНрд░реЗрдЯрд╛ рдЯреНрдпреВрдирдмрд░реНрдЧ рдПрдХ рдмрд╛рд░ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕реНрдЯреНрд░реИрдк-рдСрди рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдЖрдПрдЧрд╛ ... рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдФрд░ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреИрдХ-рдкреНрд░реЗрд╕ рд╣реИред рдФрд░ рд╡реИрд╕реЗ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╡рд░реЗрдЬ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рднреА рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
public class TreeNodeTest { @Test public void testFlux() { TreeNode tree = new TreeNode(4, new TreeNode(2, new TreeNode(1), new TreeNode(3)), new TreeNode(7, new TreeNode(6), new TreeNode(9))); StepVerifier.create(tree.flux().flatMap(n -> n.value)) .expectNext(1, 2, 3, 4, 6, 7, 9) .expectComplete() .verify(); } }
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рд╢реБрд░реБрдЖрдд рдХреА рдЧрдИ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдкреБрд░рд╛рдиреЗ, рдЙрдмрд╛рдК, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреЗрдбрд╝ рдореЗрдВ рддреАрди рд╕рд░рд▓ рддрд░реАрдХреЛрдВ invert
, sumOfLeftLeaves
рдФрд░ searchBST
рдХреЛ searchBST
рд╣реИред
рдкрд▓рдЯрдирд╛
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд invert
рд╡рд┐рдзрд┐ рд╣реИ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд╣реАрдВ рд╣реИ, рджреЗрдЦреЛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рджреБрдЦрдж рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдкреНрд▓рд╕ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдкреЗрдбрд╝ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдирдП рдиреЛрдб рдХреЗ рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдореЗрдВ, рд╣рдо рджрд╛рдПрдВ рдмрдЪреНрдЪреЗ рд╕реЗ рдЙрд▓рдЯрд╛ рдиреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдпреЗ рдЬрд╛рдБрдЪ рдирд┐рд░рд░реНрдердХ рд╣реИред
public TreeNode invert() { return invert(this); } private TreeNode invert(TreeNode root) { if (root == null) return null; TreeNode swap = new TreeNode(root.val); swap.right = invert(root.left); swap.left = invert(root.right); return swap; }
рджреЗрдЦреЛ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ рдЬрдм рд╣рдордиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛, рдпрд╣ рдирдП рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛, рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рдЕрд╢рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдорд┐рд▓реАред
public Mono<TreeNode> invert() { return Mono.just(this) .map(n -> new TreeNode(n.value, n.right.flatMap(TreeNode::invert), n.left.flatMap(TreeNode::invert) )); } @Test public void testInvert() { TreeNode tree = new TreeNode(4, new TreeNode(2, new TreeNode(1), new TreeNode(3)), new TreeNode(7, new TreeNode(6), new TreeNode(9))); Flux<Integer> inverted = tree.invert() .flatMapMany(TreeNode::flux) .flatMap(n -> n.value); StepVerifier.create(inverted) .expectNext(9, 7, 6, 4, 3, 2, 1) .expectComplete() .verify(); }
sumOfLeftLeaves
рдЖрдорддреМрд░ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╡реЗ рд╣реИрдВ рдЬреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдХреНрдпрд╛ рдХрд░реЗрдЧреА, рдФрд░ рдЕрдиреНрдп рд╕рднреА рд▓реЛрдЧ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдкрдирд╛ рдХрдорд░рд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдХрднреА рдкреЗрдбрд╝ рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВред
рдореИрдВ рдЕрдкрдиреЗ рдордиреЛрдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреА рд╕рд▓рд╛рд╣ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рдЙрдкрдЪрд╛рд░ рдЖрд╣рд╛рд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрд░реНрде рдмрддрд╛рдУред рдПрдХ рдиреЛрдб рдХреЛ рдПрдХ leaf
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХреЗ рдХреЛрдИ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдмрд╛рдПрдВ рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ рд╢рдмреНрдж, рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛ, рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рдерд╛ ...
public int sumOfLeftLeaves() { return sumOfLeftLeaves(false, this); } public int sumOfLeftLeaves(boolean left, TreeNode root) { if (root == null) return 0; if (root.left == null && root.right == null && left) return root.val; return sumOfLeftLeaves(true, root.left) + sumOfLeftLeaves(false, root.right); }
... рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдмрди рдЧрдпрд╛
public Mono<Integer> sumOfLeftLeaves() { return sumOfLeftLeaves(Mono.just(this), false) .flatMap(n -> n.value) .reduce(Integer::sum); } private Flux<TreeNode> sumOfLeftLeaves(Mono<TreeNode> node, boolean left) { return node .flux() .concatMap(n -> Flux.concat( sumOfLeftLeaves(n.left, true), Flux.first(n.left, n.right) .map(x -> new TreeNode(0)) .switchIfEmpty( Mono.just(n) ) .filter(x -> left), sumOfLeftLeaves(n.right, false) )); } @Test public void testSumOfLeftLeaves() { TreeNode tree = new TreeNode(3, new TreeNode(9, new TreeNode(11), null), new TreeNode(20, new TreeNode(15), new TreeNode(7)) ); StepVerifier.create(tree.sumOfLeftLeaves()) .expectNext(26) .expectComplete() .verify(); }
рд╡рд╛рд╣! рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ред рдмрд╣реБрдд рдХреБрдЫред рдмрд╣реБрдд рднрдпрд╛рдирдХред рдЗрддрдиреА рдЕрд╢рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ред рдмрд╣реБрдд рдкреАрдЫреЗред рдЗрд╕рд▓рд┐рдП рд╕реНрдХреЗрд▓реЗрдмрд▓ ...
рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ, рдореИрдВ рдЖрдкрд╕реЗ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рдо рдЗрд╕ рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рдХреЛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
searchBST
рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдбрд╝ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝ рдмрдирдиреЗ рдХрд╛ рд╕рдкрдирд╛ рджреЗрдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдпрд╣ рд╕рдм рдХрд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддреБрд░рдВрдд рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рднрдпрд╛рдирдХ рдерд╛, рдФрд░ рдпрд╣ рдХрд┐рддрдирд╛ рдЕрджреНрднреБрдд рд╣реЛ рдЧрдпрд╛ред
public TreeNode searchBST(int val) { return searchBST(this, val); } public TreeNode searchBST(TreeNode root, int val) { if (root == null) return null; if (val < root.val) return searchBST(root.left, val); else if (val > root.val) return searchBST(root.right, val); else return root; }
рдмрд╕ рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░реЛ:
public Mono<TreeNode> testSearchBST(int val) { return searchBST(Mono.just(this), val); } private Mono<TreeNode> searchBST(Mono<TreeNode> root, int val) { return root.flatMap(node -> node.value .filter(v -> v > val) .flatMap(v -> searchBST(node.left, val)) .switchIfEmpty(node.value .filter(v -> v < val) .flatMap(v -> searchBST(node.right, val)) .switchIfEmpty(node.value .filter(v -> v == val) .flatMap(v -> root) ) )); } @Test public void searchBST() { TreeNode tree = new TreeNode(4, new TreeNode(2, new TreeNode(1), new TreeNode(3)), new TreeNode(7)); StepVerifier.create(tree.searchBST(3).flatMap(n -> n.value)) .expectNext(3) .expectComplete() .verify(); }
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдпрд╣ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдЕрднреА рдЦрддреНрдо рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ
рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд░реЛрдХрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЖрдк рдердХреЗ рд╣реБрдП рд╣реИрдВ, рдЖрдкрдХреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рд╣реИрдВ, рдЖрдк рд╕реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдЖрдк рдкреНрд░реЗрд░рдгрд╛ рдХреА рдПрдХ рдмрдбрд╝реА рдзрд╛рд░рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рд░реБрдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рднрд╛рд╡рдирд╛ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рджреБрдирд┐рдпрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдЬрдЧрд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рджреВрд░ рдХрд┐рдП рдмрд┐рдирд╛, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ, рдмрд╕ рдЬреБрдбрд╝реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдЙрдирдХрд╛ рд╕рдордп рдЕрднреА рддрдХ рдирд╣реАрдВ рдмреАрддрд╛ рд╣реИ, рдЕрднреА рднреА рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рд▓реЛрдЧ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
public class ListNode { public int val; public ListNode next; public ListNode(int val) { this.val = val; } public ListNode(int val, ListNode next) { this.val = val; this.next = next; } public static ListNode of(int... array) { if (array.length < 1) return null; ListNode head = new ListNode(array[0]); ListNode tail = head; for (int i = 1; i < array.length; i++) { ListNode next = new ListNode(array[i]); tail.next = next; tail = next; } return head; } public ListNode last() { if (next != null) return next.last(); return this; } } public class ListTestNode { public Mono<Boolean> hasCycle(ListNode head) { return Mono.justOrEmpty(head) .flatMapMany(node -> { Flux<ListNode> flux = Flux.generate(() -> head, (n, sink) -> { if (n == null) { sink.complete(); return null; } sink.next(n); return n.next; }); Flux<ListNode> fast = flux.skip(1); Flux<ListNode> slow = flux.flatMap(n -> Flux.just(n, n)); return fast.zipWith(slow); }) .any(objects -> objects.getT1() == objects.getT2()) .defaultIfEmpty(false); } @Test public void hasCycle() { StepVerifier.create(hasCycle(null)) .expectNext(false) .expectComplete() .verify(); ListNode withoutCycle = ListNode.of(1, 2, 3, 4, 5, 6); StepVerifier.create(hasCycle(withoutCycle)) .expectNext(false) .expectComplete() .verify(); ListNode withCycle = ListNode.of(1, 2, 3, 4, 5, 6); withCycle.last().next = withCycle.next.next; StepVerifier.create(hasCycle(withCycle)) .expectNext(true) .expectComplete() .verify(); }
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЫреБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рдбрд╝реЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдкреНрд░рд┐рдп рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реЛ рддреЛ рдЪрд▓рдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдП!
public Mono<Boolean> isValidParentheses(String s) { return Flux.range(0, s.length()) .map(s::charAt) .reduceWith(() -> "", (str, c) -> { if (c == '{' || c == '[' || c == '(') return str + c; char last = str.charAt(str.length() - 1); if (c == '}' && last != '{') return str; if (c == ']' && last != '[') return str; if (c == ')' && last != '(') return str; return str.substring(0, str.length() - 1); }) .map(String::isEmpty); } @Test public void testIsValidParentheses() { StepVerifier.create(isValidParentheses("()")) .expectNext(true) .expectComplete() .verify(); StepVerifier.create(isValidParentheses("()[]{}")) .expectNext(true) .expectComplete() .verify(); StepVerifier.create(isValidParentheses("{()[]()}")) .expectNext(true) .expectComplete() .verify(); StepVerifier.create(isValidParentheses("()")) .expectNext(true) .expectComplete() .verify(); StepVerifier.create(isValidParentheses("(]")) .expectNext(false) .expectComplete() .verify(); StepVerifier.create(isValidParentheses("([)]")) .expectNext(false) .expectComplete() .verify(); }
рд╡рд╛рд╣ред рдЗрддрдирд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп ... рдмрд╣реБрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ред
рдЯрд┐рдк рдирдВрдмрд░ рджреЛ
рд╡реИрд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рд▓рд╛рд╣ рдирдВрдмрд░ рджреЛ рд╣реИ: .
рдХрднреА-рдХрднреА рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдФрд░ рдЕрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧреЗрдЧрд╛ред