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

歡迎訪問 生活随笔!

生活随笔

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

java

Java中的功能性FizzBu​​zz Kata

發(fā)布時(shí)間:2023/12/3 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的功能性FizzBu​​zz Kata 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不久前,我使用Java 8流和lambda解決了FizzBu??zz kata問題。 盡管最終結(jié)果是可行的,但中間步驟卻沒有。 我當(dāng)然可以做得更好。

與往常一樣,讓我們??從失敗的測(cè)試開始:

package remonsinnema.blog.fizzbuzz; + + import static org.junit.Assert.assertEquals; + + import org.junit.Test; + + + public class WhenFunctionallyFuzzingAndBuzzing { + + private final FizzBuzzer fizzBuzzer = new FizzBuzzer(); + + @Test + public void shouldReplaceMultiplesOfThreeWithFizzAndMultiplesOfFiveWithBuzz() { + assertEquals(“1”, “1”, fizzBuzzer.apply(1)); + } + + }package remonsinnema.blog.fizzbuzz; + + import java.util.function.Function; + + + public class FizzBuzzer implements Function<Integer, String> { + + @Override + public String apply(Integer n) { + return null; + } + + }

請(qǐng)注意,我馬上就開始使用Java的Function進(jìn)行功能課程。

我偽造實(shí)現(xiàn)以使測(cè)試通過:

public class FizzBuzzer implements Function<Integer, String> {@Overridepublic String apply(Integer n) { – return null; + return “1”;}}

并重構(gòu)測(cè)試以消除重復(fù):

public class WhenFunctionallyFuzzingAndBuzzing {@Testpublic void shouldReplaceMultiplesOfThreeWithFizzAndMultiplesOfFiveWithBuzz() { – assertEquals(“1”, “1”, fizzBuzzer.apply(1)); + assertFizzBuzz(“1”, 1); + } + + private void assertFizzBuzz(String expected, int value) { + assertEquals(Integer.toString(value), expected, fizzBuzzer.apply(value));}}

然后,我添加另一個(gè)測(cè)試以概括實(shí)現(xiàn):

public class WhenFunctionallyFuzzingAndBuzzing {@Testpublic void shouldReplaceMultiplesOfThreeWithFizzAndMultiplesOfFiveWithBuzz() {assertFizzBuzz(“1”, 1); + assertFizzBuzz(“2”, 2);}private void assertFizzBuzz(String expected, int value) {public class FizzBuzzer implements Function<Integer, String> {@Overridepublic String apply(Integer n) { – return “1”; + return Integer.toString(n);}}

好的,到目前為止,非常標(biāo)準(zhǔn)的東西。 接下來,我需要將3替換為“ Fizz”:

public class WhenFunctionallyFuzzingAndBuzzing {public void shouldReplaceMultiplesOfThreeWithFizzAndMultiplesOfFiveWithBuzz() {assertFizzBuzz(“1”, 1);assertFizzBuzz(“2”, 2); + assertFizzBuzz(“Fizz”, 3);}nbsp;private void assertFizzBuzz(String expected, int value) {public class FizzBuzzer implements Function<Integer, String> {@Overridepublic String apply(Integer n) { – return Integer.toString(n); + return numberReplacerFor(n).apply(n); + } + + private Function<Integer, String> numberReplacerFor(Integer n) { + return n == 3 + ? i -> “Fizz” + : i -> Integer.toString(i);}}

在這里,我認(rèn)識(shí)到我需要根據(jù)輸入應(yīng)用兩個(gè)函數(shù)之一。 該代碼有效,但需要進(jìn)行一些清理。 首先,作為墊腳石,我將lambda提取到各個(gè)字段中:

import java.util.function.Function;public class FizzBuzzer implements Function<Integer, String> { + private final Function<Integer, String> replaceNumberWithStringRepresentation + = n -> Integer.toString(n); + private final Function<Integer, String> replaceNumberWithFizz + = n -> “Fizz”; +@Overridepublic String apply(Integer n) {return numberReplacerFor(n).apply(n);private Function<Integer, String> numberReplacerFor(Integer n) {return n == 3 – ? i -> “Fizz” – : i -> Integer.toString(i); + ? replaceNumberWithFizz + : replaceNumberWithStringRepresentation;}}

接下來,我強(qiáng)??調(diào)通過提取一個(gè)類將“ 3”和“ Fizz”結(jié)合在一起:

public class FizzBuzzer implements Function<Integer, String> {private final Function<Integer, String> replaceNumberWithStringRepresentation= n -> Integer.toString(n); – private final Function<Integer, String> replaceNumberWithFizz – = n -> “Fizz”; + private final Fizzer replaceNumberWithFizz = new Fizzer();@Overridepublic String apply(Integer n) {}private Function<Integer, String> numberReplacerFor(Integer n) { – return n == 3 + return replaceNumberWithFizz.test(n)? replaceNumberWithFizz: replaceNumberWithStringRepresentation;} + package remonsinnema.blog.fizzbuzz; + + import java.util.function.Function; + import java.util.function.Predicate; + + + public class Fizzer implements Function<Integer, String>, Predicate<Integer> { + + @Override + public boolean test(Integer n) { + return n == 3; + } + + @Override + public String apply(Integer n) { + return “Fizz”; + } + + }

在這里,我使用標(biāo)準(zhǔn)的Java Predicate功能接口。

要添加“ Buzz”,我需要將代碼從單個(gè)if (隱藏為三元運(yùn)算符)推廣到循環(huán):

public class WhenFunctionallyFuzzingAndBuzzing {assertFizzBuzz(“1”, 1);assertFizzBuzz(“2”, 2);assertFizzBuzz(“Fizz”, 3); + assertFizzBuzz(“4”, 4); + assertFizzBuzz(“Buzz”, 5);}private void assertFizzBuzz(String expected, int value) {package remonsinnema.blog.fizzbuzz; + import java.util.Arrays; + import java.util.Collection;import java.util.function.Function;private final Function<Integer, String> replaceNumberWithStringRepresentation= n -> Integer.toString(n); – private final Fizzer replaceNumberWithFizz = new Fizzer(); + private final Collection<ReplaceNumberWithFixedText> replacers = Arrays.asList( + new ReplaceNumberWithFixedText(3, “Fizz”), + new ReplaceNumberWithFixedText(5, “Buzz”) + );@Overridepublic String apply(Integer n) {}private Function<Integer, String> numberReplacerFor(Integer n) { – return replaceNumberWithFizz.test(n) – ? replaceNumberWithFizz – : replaceNumberWithStringRepresentation; + for (ReplaceNumberWithFixedText replacer : replacers) { + if (replacer.test(n)) { + return replacer; + } + } + return replaceNumberWithStringRepresentation;}}package remonsinnema.blog.fizzbuzz; – – import java.util.function.Function; – import java.util.function.Predicate; – – – public class Fizzer implements Function<Integer, String>, Predicate<Integer> { – – @Override – public boolean test(Integer n) { – return n == 3; – } – – @Override – public String apply(Integer n) { – return “Fizz”; – } – – }package remonsinnema.blog.fizzbuzz; + + import java.util.function.Function; + import java.util.function.Predicate; + + + public class ReplaceNumberWithFixedText implements Function<Integer, String>, + Predicate<Integer> { + + private final int target; + private final String replacement; + + public ReplaceNumberWithFixedText(int target, String replacement) { + this.target = target; + this.replacement = replacement; + } + + @Override + public boolean test(Integer n) { + return n == target; + } + + @Override + public String apply(Integer n) { + return replacement; + } + + }

糟糕,舊習(xí)慣……那應(yīng)該是一個(gè)循環(huán)而不是循環(huán):

import java.util.function.Function;public class FizzBuzzer implements Function<Integer, String> { – private final Function<Integer, String> replaceNumberWithStringRepresentation + private final Function<Integer, String> defaultReplacer= n -> Integer.toString(n);private final Collection<ReplaceNumberWithFixedText> replacers = Arrays.asList(new ReplaceNumberWithFixedText(3, “Fizz”),}private Function<Integer, String> numberReplacerFor(Integer n) { – for (ReplaceNumberWithFixedText replacer : replacers) { – if (replacer.test(n)) { – return replacer; – } – } – return replaceNumberWithStringRepresentation; + return replacers.stream() + .filter(replacer -> replacer.test(n)) + .map(replacer -> (Function<Integer, String>) replacer) + .findFirst() + .orElse(defaultReplacer);}}

好多了。 下一個(gè)測(cè)試是用于倍數(shù)的:

public class WhenFunctionallyFuzzingAndBuzzing {assertFizzBuzz(“Fizz”, 3);assertFizzBuzz(“4”, 4);assertFizzBuzz(“Buzz”, 5); + assertFizzBuzz(“Fizz”, 6);}private void assertFizzBuzz(String expected, int value) {public class FizzBuzzer implements Function<Integer, String> {private final Function<Integer, String> defaultReplacer= n -> Integer.toString(n); – private final Collection<ReplaceNumberWithFixedText> replacers = Arrays.asList( – new ReplaceNumberWithFixedText(3, “Fizz”), – new ReplaceNumberWithFixedText(5, “Buzz”) + private final Collection<ReplaceMultipleWithFixedText> replacers = Arrays.asList( + new ReplaceMultipleWithFixedText(3, “Fizz”), + new ReplaceMultipleWithFixedText(5, “Buzz”));@Override+ package remonsinnema.blog.fizzbuzz; + + import java.util.function.Function; + import java.util.function.Predicate; + + + public class ReplaceNumberWithFixedText implements Function<Integer, String>, + Predicate<Integer> { + + private final int target; + private final String replacement; + + public ReplaceNumberWithFixedText(int target, String replacement) { + this.target = target; + this.replacement = replacement; + } + + @Override + public boolean test(Integer n) { + return n % target == 0; + } + + @Override + public String apply(Integer n) { + return replacement; + } + + }– package remonsinnema.blog.fizzbuzz; – – import java.util.function.Function; – import java.util.function.Predicate; – – – public class ReplaceNumberWithFixedText implements Function<Integer, String>, Predicate<Integer> { – – private final int target; – private final String replacement; – – public ReplaceNumberWithFixedText(int target, String replacement) { – this.target = target; – this.replacement = replacement; – } – – @Override – public boolean test(Integer n) { – return n == target; – } – – @Override – public String apply(Integer n) { – return replacement; – } – – }

最后一個(gè)測(cè)試是結(jié)合Fizz和Buzz:

public class WhenFunctionallyFuzzingAndBuzzing {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 value) {package remonsinnema.blog.fizzbuzz;import java.util.Arrays;import java.util.Collection;import java.util.function.Function; + import java.util.stream.Collectors; + import java.util.stream.Stream;public class FizzBuzzer implements Function<Integer, String> {@Overridepublic String apply(Integer n) { – return numberReplacerFor(n).apply(n); + return numberReplacersFor(n) + .map(function -> function.apply(n)) + .collect(Collectors.joining());} – private Function<Integer, String> numberReplacerFor(Integer n) { – return replacers.stream() + private Stream<Function<Integer, String>> numberReplacersFor(Integer n) { + return Stream.of(replacers.stream().filter(replacer -> replacer.test(n)).map(replacer -> (Function<Integer, String>) replacer).findFirst() – .orElse(defaultReplacer); + .orElse(defaultReplacer));}}

我概括了單一Function到一個(gè)Stream的Function S,而我應(yīng)用的map-reduce模式。 我本可以使用.reduce("", (a, b) -> a + b)類的東西來拼寫Reduce的部分,但我認(rèn)為Collectors.joining()更具表現(xiàn)力。

這還沒有通過測(cè)試,因?yàn)槲曳祷亓藛蝹€(gè)函數(shù)的流。 該修復(fù)有些棘手,因?yàn)槲倚枰朗欠裾业搅巳魏芜m用的替換器函數(shù),并且您必須在不終止流的情況下才能做到這一點(diǎn) 。 所以我需要使用StreamSupport創(chuàng)建一個(gè)新的流:

package remonsinnema.blog.fizzbuzz;import java.util.Arrays;import java.util.Collection; + import java.util.Iterator; + import java.util.Spliterators;import java.util.function.Function;import java.util.stream.Collectors;import java.util.stream.Stream; + import java.util.stream.StreamSupport;public class FizzBuzzer implements Function<Integer, String> {}private Stream<Function<Integer, String>> numberReplacersFor(Integer n) { – return Stream.of(replacers.stream() + Iterator<Function<Integer, String>> result = replacers.stream().filter(replacer -> replacer.test(n)).map(replacer -> (Function<Integer, String>) replacer) – .findFirst() – .orElse(defaultReplacer)); + .iterator(); + return result.hasNext() + ? StreamSupport.stream(Spliterators.spliteratorUnknownSize(result, 0), false) + : Stream.of(defaultReplacer);}}

就是這樣。 完整代碼在GitHub上 。

我從這個(gè)小練習(xí)中學(xué)到了兩個(gè)教訓(xùn):

  • Java附帶了一堆功能接口,例如Function和Predicate ,可以很容易地與流結(jié)合以解決各種問題。
  • 在功能世界中, if → while 轉(zhuǎn)換成為if → stream的標(biāo)準(zhǔn)。
  • 翻譯自: https://www.javacodegeeks.com/2016/08/functional-fizzbuzz-kata-java.html

    總結(jié)

    以上是生活随笔為你收集整理的Java中的功能性FizzBu​​zz Kata的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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