Ich suche nach einem eleganten Weg einen Stream zu durchlaufen mit Sonderbehandlung des ersten Elements. Ich habe ein paar Ansätze und Libraries gefunden und ausprobiert, aber bin noch nicht so zufrieden, da alle über den Index gehen und ich das gern weghaben möchte. Vielleicht fällt jemandem noch etwas besseres ein oder jemand kennt eine passende Lib.
[CODE lang="java" title="StreamFirstTest"]
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
class StreamFirstTest {
private final List<String> input = Lists.newArrayList("a", "b", "c");
private final List<String> expected = Lists.newArrayList("first", "b", "c");
@Test
public void test_mapThingsWithSpecialCaseFirstItem() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_Index() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_Index(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_Guava() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_Guava_mapWithIndex(input);
assertThat(actual).isEqualTo(expected);
}
}
[/CODE]
[CODE lang="java" title="StreamFirst"]import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.util.streamex.EntryStream;
import com.google.common.collect.Streams;
public class StreamFirst {
private static String mapping(String item, boolean isFirstItem) {
if (isFirstItem) {
return "first";
} else {
return item;
}
}
public static List<String> mapThingsWithSpecialCaseFirstItem(List<String> list) {
return list
.stream()
.map(item -> mapping(item, list.indexOf(item) == 0))
.collect(Collectors.toList());
}
public static List<String> mapThingsWithSpecialCaseFirstItem_Index(List<String> list) {
return IntStream.range(0, list.size())
.mapToObj(i -> mapping(list.get(i), i == 0))
.collect(Collectors.toList());
}
public static List<String> mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream(List<String> list) {
return EntryStream.of(list)
.mapKeyValue((index, item) -> mapping(item, index == 0))
.toList();
}
@SuppressWarnings("UnstableApiUsage")
public static List<String> mapThingsWithSpecialCaseFirstItem_Guava_mapWithIndex(List<String> list) {
return Streams.mapWithIndex(list.stream(), (item, index) -> mapping(item, index == 0))
.collect(Collectors.toList());
}
}[/CODE]
[CODE lang="java" title="StreamFirstTest"]
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
class StreamFirstTest {
private final List<String> input = Lists.newArrayList("a", "b", "c");
private final List<String> expected = Lists.newArrayList("first", "b", "c");
@Test
public void test_mapThingsWithSpecialCaseFirstItem() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_Index() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_Index(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream(input);
assertThat(actual).isEqualTo(expected);
}
@Test
public void test_mapThingsWithSpecialCaseFirstItem_Guava() {
final List<String> actual = StreamFirst.mapThingsWithSpecialCaseFirstItem_Guava_mapWithIndex(input);
assertThat(actual).isEqualTo(expected);
}
}
[/CODE]
[CODE lang="java" title="StreamFirst"]import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.util.streamex.EntryStream;
import com.google.common.collect.Streams;
public class StreamFirst {
private static String mapping(String item, boolean isFirstItem) {
if (isFirstItem) {
return "first";
} else {
return item;
}
}
public static List<String> mapThingsWithSpecialCaseFirstItem(List<String> list) {
return list
.stream()
.map(item -> mapping(item, list.indexOf(item) == 0))
.collect(Collectors.toList());
}
public static List<String> mapThingsWithSpecialCaseFirstItem_Index(List<String> list) {
return IntStream.range(0, list.size())
.mapToObj(i -> mapping(list.get(i), i == 0))
.collect(Collectors.toList());
}
public static List<String> mapThingsWithSpecialCaseFirstItem_StreamEx_EntryStream(List<String> list) {
return EntryStream.of(list)
.mapKeyValue((index, item) -> mapping(item, index == 0))
.toList();
}
@SuppressWarnings("UnstableApiUsage")
public static List<String> mapThingsWithSpecialCaseFirstItem_Guava_mapWithIndex(List<String> list) {
return Streams.mapWithIndex(list.stream(), (item, index) -> mapping(item, index == 0))
.collect(Collectors.toList());
}
}[/CODE]