Java 8 cuts to 2 lines

Can I do this using threads?

StringBuilder text = new StringBuilder();
StringBuilder dupText = new StringBuilder();
String lastLetter = "";

for (Container cont : containersList) {
    String letter = cont.getLetter();
    text.append(letter);
    if (letter.equals(lastLetter) == false) {
        dupText.append(letter);
    }
    lastLetter = letter;
}

System.out.println(text);
System.out.println(dupText);

I am looking at a list of continents, each of which has a char. I need to collect two lines: one - all combinations of characters, and the other - all characters, but without related duplicates (ABABAAAB → ABABAB)

Can this be done with threads?

I tried to do it like this:

Optional<String> text = containersList.stream()
            .map(Container::getLetter)
            .reduce((letter,accumalator) -> accumalator += letter);

Optional<String> dupText = session.containersList().stream()
            .map(Container::getLetter)
            .reduce((letter, accumalator) ->{
                if ((accumalator.endsWith(letter) == false)) {
                    accumalator += letter;
                }
                return accumalator;
            });
+4
source share
4 answers

Using StreamEx Library

You can do this in one stream pipeline using the StreamEx library .

List<Container> containersList = Arrays.asList(new Container("A"), new Container("B"), new Container("A"), new Container("A"), new Container("B"));

String[] result =
        StreamEx.of(containersList)
                .map(Container::getLetter)
                .groupRuns(Object::equals)
                .collect(MoreCollectors.pairing(
                    MoreCollectors.flatMapping(List::stream, Collectors.joining()),
                    MoreCollectors.mapping(l -> l.get(0), Collectors.joining()),
                    (s1, s2) -> new String[] { s1, s2 }
                ));

System.out.println(result[0]);
System.out.println(result[1]);

This code creates a stream of containers and maps each of them to their letter.

groupRuns List , . String: , [A, A, B], Stream [List(A, A), List(B)] ( - 2 A ).

, pairing, . , (, ).

, .

:

ABAAB
ABAB

API

API , Collector:

public static void main(String[] args) {
    List<Container> containersList = Arrays.asList(new Container("A"), new Container("B"), new Container("A"), new Container("A"), new Container("B"));

    String[] result = containersList.stream().parallel().map(Container::getLetter).collect(ContainerCollector.collector());

    System.out.println(result[0]);
    System.out.println(result[1]);
}

private static final class ContainerCollector {

    private StringBuilder text = new StringBuilder();
    private StringBuilder dupText = new StringBuilder();

    private void accept(String letter) {
        text.append(letter);
        if (dupText.indexOf(letter, dupText.length() - letter.length()) < 0) {
            dupText.append(letter);
        }
    }

    private ContainerCollector combine(ContainerCollector other) {
        text.append(other.text);
        other.dupText.codePoints().forEach(i -> {
            String letter = new String(Character.toChars(i));
            if (dupText.indexOf(letter, dupText.length() - letter.length()) < 0) {
                dupText.append(letter);
            }
        });
        return this;
    }

    private String[] finish() {
        return new String[] { text.toString(), dupText.toString() };
    }

    private static Collector<String, ?, String[]> collector() {
        return Collector.of(ContainerCollector::new, ContainerCollector::accept, ContainerCollector::combine, ContainerCollector::finish);
    }

}

text dupText, . text . dupText , .

( ) dupText: , . , .

.

+5

- . .

:

import java.util.ArrayList;
import java.util.Collection;
import java.util.stream.Collectors;

class Container {

    private char letter;

    public String getLetter() {
        return Character.toString(letter);
    }

    public static Container of(char letter) {
        Container container = new Container();
        container.letter = letter;
        return container;
    }

}
public class T {

    public static void main(String[] args) {

        Collection<Container> containersList = new ArrayList<>();
        containersList.add(Container.of('A'));
        containersList.add(Container.of('B'));
        containersList.add(Container.of('A'));
        containersList.add(Container.of('B'));
        containersList.add(Container.of('A'));
        containersList.add(Container.of('A'));
        containersList.add(Container.of('A'));
        containersList.add(Container.of('B'));

        // at first join characters, don't bother about duplicates
        String text = containersList.stream()
        .map(Container::getLetter)
        .collect(Collectors.joining());

        // afterwards remove duplicates
        StringBuilder dupText = new StringBuilder();
        Character lastLetter = null;
        for (Character c : text.toCharArray()) {
            if (c.equals(lastLetter))
                continue;
            dupText.append(c);
            lastLetter = c;
        }

        System.out.println(text);
        System.out.println(dupText);
    }

}

:

// at first join characters, don't bother about duplicates
String text = containersList.stream()
        .map(Container::getLetter)
        .collect(Collectors.joining());

// afterwards remove duplicates
String dupText = text.chars()
        .mapToObj(i -> Character.toString((char)i))
        .reduce((left,right) -> {
            if (left.endsWith(right))
                return left;
            return left+right;
        })
        .get();

, :

MyBuilder myBuilder = new MyBuilder();

containersList.stream()
.map(Container::getLetter)
.forEachOrdered(myBuilder::accept);

System.out.println(myBuilder.text);
System.out.println(myBuilder.dupText);

:

class MyBuilder {

    StringBuilder text = new StringBuilder();
    StringBuilder dupText = new StringBuilder();
    String lastLetter;

    void accept(String letter) {
        text.append(letter);

        if (letter.equals(lastLetter) == false) {
            dupText.append(letter);
        }

        lastLetter = letter;
    }
}
+3

. -, :

String dupText = containersList.stream()
        .map(Container::getLetter)
        .collect(Collectors.joining());

, :

String text = dupText.replaceAll("(.)\\1+", "$1");

, , , , , , , . .

+3

, StreamEx:

Collector<Entry<String, Long>, ?, String[]> collector = MoreCollectors.pairing(
    Collectors.mapping(e -> StreamEx.constant(e.getKey(), e.getValue()).joining(), 
                            Collectors.joining()),
    Collectors.mapping(e -> e.getKey(), Collectors.joining()),
    (s1, s2) -> new String[] { s1, s2 }
);
String[] result = StreamEx.of(containersList).map(Container::getLetter)
        .runLengths().collect(collector);

System.out.println(result[0]);
System.out.println(result[1]);

, , @Tunaki, : , ( groupRuns()) ( runLengths())

+1

Source: https://habr.com/ru/post/1624108/


All Articles