001package edu.pdx.cs410J.whitlock; 002 003import java.util.regex.Pattern; 004import java.util.stream.Collectors; 005import java.util.stream.Stream; 006 007/** 008 * This class is represents a <code>Student</code>. 009 */ 010public class WordSpinner { 011 012 static String spinWord(String word) { 013 if (word.length() >= 5) { 014 return reverseWord(word); 015 016 } else { 017 return word; 018 } 019 } 020 021 private static String reverseWord(String word) { 022 return new StringBuilder(word).reverse().toString(); 023 } 024 025 static String spinSentence(String sentence, WordSpinnerStrategy strategy) { 026 return strategy.spinSentence(sentence); 027 } 028 029 static String spinSentence(String sentence) { 030 return spinSentence(sentence, new StreamBasedStrategy()); 031 } 032 033 interface WordSpinnerStrategy { 034 String spinSentence(String sentence); 035 } 036 037 static class OriginalStrategy implements WordSpinnerStrategy { 038 @Override 039 public String spinSentence(String sentence) { 040 String[] words = sentence.split(" "); 041 StringBuilder sb = new StringBuilder(); 042 for (String word : words) { 043 sb.append(spinWord(word)); 044 sb.append(" "); 045 } 046 return sb.toString().trim(); 047 } 048 } 049 050 static class StreamBasedStrategy implements WordSpinnerStrategy { 051 @Override 052 public String spinSentence(String sentence) { 053 Pattern pattern = Pattern.compile(" "); 054 055 Stream<String> stream = pattern.splitAsStream(sentence); 056 return enableParallel(stream) 057 .map(WordSpinner::spinWord) 058 .collect(Collectors.joining(" ")); 059 } 060 061 protected Stream<String> enableParallel(Stream<String> stream) { 062 return stream; 063 } 064 } 065 066 static class ParallelStreamBasedStrategy extends StreamBasedStrategy { 067 @Override 068 protected Stream<String> enableParallel(Stream<String> stream) { 069 return stream.parallel(); 070 } 071 } 072}