日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

kata_FizzBu​​zz Kata与Java流

發(fā)布時間:2023/12/3 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kata_FizzBu​​zz Kata与Java流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

kata

在柔道練習(xí)僅幾周之后,我的兒子感到無聊。 他抱怨說自己沒有學(xué)任何東西,因為他一遍又一遍地做著同樣的事情。

混淆學(xué)習(xí)和做新事物的不僅是幼兒。 例如,有多少軟件開發(fā)人員通過執(zhí)行kata或參加dojos來進(jìn)行刻意練習(xí)的麻煩?

重復(fù)您已經(jīng)做過很多次的練習(xí)似乎很愚蠢,但事實并非如此。 這是在您的領(lǐng)域成為黑帶的唯一方法。 記住,掌握是三個內(nèi)在動機之一 (其他是自主性和目的性)。

實踐意味著放慢腳步,將重點從結(jié)果轉(zhuǎn)移到流程。 最好使用可以在有限的時間內(nèi)完成的簡單練習(xí),因此您可以多次執(zhí)行相同的練習(xí)。

我發(fā)現(xiàn)我在練習(xí)時幾乎總是學(xué)到新東西。 這不是因為我從上次就忘記了解決問題的方法,而是因為我從那時起就學(xué)到了新東西,因此可以用新的眼光看世界。

例如,自Java 8發(fā)布以來,我一直在嘗試使用新的流類來幫助轉(zhuǎn)變?yōu)楦吖δ苄缘木幊田L(fēng)格。 這改變了我看待舊問題(例如FizzBu??zz)的方式 。

讓我們看看實際情況。 當(dāng)然,我首先添加一個測試:

+ package remonsinnema.blog.fizzbuzz; + + import static org.junit.Assert.assertEquals; + + import org.junit.Test; + + + public class WhenFizzingAndBuzzing { + + private final FizzBuzz fizzbuzz = new FizzBuzz(); + + @Test + public void shouldReplaceWithFizzAndBuzz() { + assertEquals(“1”, “1”, fizzbuzz.get(1)); + } + + }

該測試使用單元測試的“ 何時……應(yīng)該”形式, 該形式有助于關(guān)注行為而不是實現(xiàn)細(xì)節(jié)。 我讓Eclipse生成進(jìn)行此編譯所需的代碼:

+ package remonsinnema.blog.fizzbuzz; + + + public class FizzBuzz { + + public String get(int i) { + return null; + } + + }

使測試通過的最簡單的代碼是偽造它 :

package remonsinnema.blog.fizzbuzz;public class FizzBuzz {public String get(int i) { – return null; + return “1”;}}

現(xiàn)在測試通過了,該重構(gòu)了 。 我從測試中刪除了重復(fù)項:

public class WhenFizzingAndBuzzing {@Testpublic void shouldReplaceWithFizzAndBuzz() { – assertEquals(“1”, “1”, fizzbuzz.get(1)); + assertFizzBuzz(“1”, 1); + } + + private void assertFizzBuzz(String expected, int n) { + assertEquals(Integer.toString(n), expected, fizzbuzz.get(n));}}

接下來,我添加一個測試以強制執(zhí)行真正的實現(xiàn):

public class WhenFizzingAndBuzzing {@Testpublic void shouldReplaceWithFizzAndBuzz() {assertFizzBuzz(“1”, 1); + assertFizzBuzz(“2”, 2);}private void assertFizzBuzz(String expected, int n) {package remonsinnema.blog.fizzbuzz;public class FizzBuzz { – public String get(int i) { – return “1”; + public String get(int n) { + return Integer.toString(n);}}

好的,現(xiàn)在讓我們對Fizz進(jìn)行測試:

public class WhenFizzingAndBuzzing { public void shouldReplaceWithFizzAndBuzz() { assertFizzBuzz(“1”, 1); assertFizzBuzz(“2”, 2); + assertFizzBuzz(“Fizz”, 3); } private void assertFizzBuzz(String expected, int n) { package remonsinnema.blog.fizzbuzz; public class FizzBuzz { public String get(int n) { + if (n == 3) { + return “Fizz”; + } return Integer.toString(n); }

與Buzz類似:

public class WhenFizzingAndBuzzing {assertFizzBuzz(“Fizz”, 3); + assertFizzBuzz(“4”, 4); + assertFizzBuzz(“Buzz”, 5);}private void assertFizzBuzz(String expected, int n) {public class FizzBuzz {if (n == 3) {return “Fizz”;} + if (n == 5) { + return “Buzz”; + }return Integer.toString(n);}

在這里,我只是復(fù)制并粘貼了if語句以使其快速工作。 當(dāng)然,我們不應(yīng)該在這里停下來,而要擺脫骯臟的東西。 在這種情況下,那是重復(fù)的。

首先,讓我們更新代碼以使重復(fù)更加明顯:

package remonsinnema.blog.fizzbuzz;public class FizzBuzz {public String get(int n) { – if (n == 3) { – return “Fizz”; + MultipleReplacer replacer = new MultipleReplacer(3, “Fizz”); + if (n == replacer.getValue()) { + return replacer.getText();} – if (n == 5) { – return “Buzz”; + replacer = new MultipleReplacer(5, “Buzz”); + if (n == replacer.getValue()) { + return replacer.getText();}return Integer.toString(n);}+ package remonsinnema.blog.fizzbuzz; + + + public class MultipleReplacer { + + private final int value; + private final String text; + + public MultipleReplacer(int value, String text) { + this.value = value; + this.text = text; + } + + public int getValue() { + return value; + } + + public String getText() { + return text; + } + + }

我剛剛創(chuàng)建了一個新的值對象,以保存在復(fù)制/粘貼后必須更改的兩個值。

現(xiàn)在,重復(fù)項更加清晰了,可以輕松刪除它:

package remonsinnema.blog.fizzbuzz; + import java.util.Arrays; + import java.util.Collection; +public class FizzBuzz { + private final Collection replacers = Arrays.asList( + new MultipleReplacer(3, “Fizz”), new MultipleReplacer(5, “Buzz”)); +public String get(int n) { – MultipleReplacer replacer = new MultipleReplacer(3, “Fizz”); – if (n == replacer.getValue()) { – return replacer.getText(); – } – replacer = new MultipleReplacer(5, “Buzz”); – if (n == replacer.getValue()) { – return replacer.getText(); + for (MultipleReplacer replacer : replacers) { + if (n == replacer.getValue()) { + return replacer.getText(); + }}return Integer.toString(n);}

但是,我還沒有完成清理工作。 當(dāng)前代碼受功能嫉妒之苦 ,我可以通過將行為移入值對象來解決:

package remonsinnema.blog.fizzbuzz;import java.util.Arrays;import java.util.Collection; + import java.util.Optional;public class FizzBuzz {public String get(int n) {for (MultipleReplacer replacer : replacers) { – if (n == replacer.getValue()) { – return replacer.getText(); + Optional result = replacer.textFor(n); + if (result.isPresent()) { + return result.get();}}return Integer.toString(n);package remonsinnema.blog.fizzbuzz; + import java.util.Optional; +public class MultipleReplacer {this.text = text;} – public int getValue() { – return value; – } – – public String getText() { – return text; + public Optional<String> textFor(int n) { + if (n == value) { + return Optional.of(text); + } + return Optional.empty();}}

現(xiàn)在我已經(jīng)完成了重構(gòu),我可以繼續(xù)執(zhí)行倍數(shù):

public class WhenFizzingAndBuzzing {assertFizzBuzz(“Fizz”, 3);assertFizzBuzz(“4”, 4);assertFizzBuzz(“Buzz”, 5); + assertFizzBuzz(“Fizz”, 6);}private void assertFizzBuzz(String expected, int n) {public class MultipleReplacer {}public Optional<String> textFor(int n) { – if (n == value) { + if (n % value == 0) {return Optional.of(text);}return Optional.empty();

最終測試是同時進(jìn)行“嘶嘶聲”和“嗡嗡聲”測試:

public class WhenFizzingAndBuzzing {assertFizzBuzz(“4”, 4);assertFizzBuzz(“Buzz”, 5);assertFizzBuzz(“Fizz”, 6); + assertFizzBuzz(“7”, 7); + assertFizzBuzz(“8”, 8); + assertFizzBuzz(“Fizz”, 9); + assertFizzBuzz(“Buzz”, 10); + assertFizzBuzz(“11”, 11); + assertFizzBuzz(“Fizz”, 12); + assertFizzBuzz(“13”, 13); + assertFizzBuzz(“14”, 14); + assertFizzBuzz(“FizzBuzz”, 15);}private void assertFizzBuzz(String expected, int n) {public class FizzBuzz {public class FizzBuzz {new MultipleReplacer(3, “Fizz”), new MultipleReplacer(5, “Buzz”));public String get(int n) { + StringBuilder result = new StringBuilder();for (MultipleReplacer replacer : replacers) { – Optional<String> result = replacer.textFor(n); – if (result.isPresent()) { – return result.get(); + Optional<String> replacement = replacer.textFor(n); + if (replacement.isPresent()) { + result.append(replacement.get());}} + if (result.length() > 0) { + return result.toString(); + }return Integer.toString(n);}}

這段代碼相當(dāng)復(fù)雜,但這是流可以解決的地方:

public class FizzBuzz {new MultipleReplacer(3, “Fizz”), new MultipleReplacer(5, “Buzz”));public String get(int n) { – StringBuilder result = new StringBuilder(); – for (MultipleReplacer replacer : replacers) { – Optional<String> replacement = replacer.textFor(n); – if (replacement.isPresent()) { – result.append(replacement.get()); – } – } – if (result.length() > 0) { – return result.toString(); – } – return Integer.toString(n); + return replacers.stream() + .map(replacer -> replacer.textFor(n)) + .filter(Optional::isPresent) + .map(optional -> optional.get()) + .reduce((a, b) -> a + b) + .orElse(Integer.toString(n));}}

請注意for和if語句如何消失。 而不是拼寫出的東西需要如何做,我們說什么 ,我們要實現(xiàn)的。

我們可以應(yīng)用相同的技巧來除去ode基數(shù)中剩余的if語句:

public class MultipleReplacer {}public Optional<String> textFor(int n) { – if (n % value == 0) { – return Optional.of(text); – } – return Optional.empty(); + return Optional.of(text) + .filter(ignored -> n % value == 0);}}

該代碼在GitHub上 。

翻譯自: https://www.javacodegeeks.com/2016/05/fizzbuzz-kata-java-streams.html

kata

總結(jié)

以上是生活随笔為你收集整理的kata_FizzBu​​zz Kata与Java流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。