Skip to content

Instantly share code, notes, and snippets.

@civic
Created April 15, 2014 05:25

Revisions

  1. civic created this gist Apr 15, 2014.
    85 changes: 85 additions & 0 deletions StreamStudy.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    package java8;

    import java.util.Arrays;
    import java.util.EnumSet;
    import java.util.List;
    import java.util.Set;
    import java.util.function.BiConsumer;
    import java.util.function.BinaryOperator;
    import java.util.function.Function;
    import java.util.function.Supplier;
    import java.util.stream.Collector;
    import java.util.stream.Stream;

    /**
    * Java8のCollectorをfor文と比較しながら一から作って理解する
    * @author civic
    */
    public class StreamStudy {

    public static void main(String[] args) {

    //forでの実装
    {
    List<String> list = Arrays.asList("Hello", "World", "Java8", "Stream", "API");
    StringBuilder buff = new StringBuilder();
    for (String s: list){
    if (buff.length() != 0){
    buff.append(", ");
    }
    buff.append(s);
    }
    String commaJoinedString = buff.toString();
    System.out.println(commaJoinedString);
    }


    //collectorでの実装
    {
    Stream<String> stream = Arrays.asList("Hello", "World", "Java8", "Stream", "API").stream();

    String commaJoinedString = stream.parallel().collect(new MyStringJoinCollector());
    System.out.println(commaJoinedString);
    }

    }

    private static class MyStringJoinCollector implements Collector<String, StringBuilder, String>{

    @Override
    public Supplier<StringBuilder> supplier() {
    return () -> new StringBuilder();
    }

    @Override
    public BiConsumer<StringBuilder, String> accumulator() {
    return (sb, s) -> {
    if (sb.length() != 0){
    sb.append(", ");
    }
    sb.append(s);
    };
    }

    @Override
    public BinaryOperator<StringBuilder> combiner() {
    return (sb1, sb2) ->{
    if (sb1.length() != 0){
    sb1.append(", ");
    }
    sb1.append(sb2);
    return sb1;
    };
    }

    @Override
    public Function<StringBuilder, String> finisher() {
    return sb -> sb.toString();
    }

    @Override
    public Set<Characteristics> characteristics() {
    return EnumSet.noneOf(Characteristics.class);
    }
    }
    }