Java 8提供
Stream.of(item).collect(Collectors.toSomeCollection())
Run Code Online (Sandbox Code Playgroud)
例如Stream.of("abc").collect(Collectors.toSet()).避免相对昂贵的new操作员在窗帘前快速
new SomeCollection(Arrays.asList(item))
Run Code Online (Sandbox Code Playgroud)
例如new HashSet<>(Arrays.asList("abc"))?
我确信不同集合的初始化new具有不同的成本(哈希集在准备使用之前需要哈希表,数组列表是分配的数组,而链表不需要这样).
我试图弄清楚流相关类是否在new内部避免,但OpenJDK代码很难理解.我认为如果我将其Stream.of视为已初始化的管道和使用可重用功能的收集器,它们就可以了.
可能是反过来了吗?
我有一个以字符串为值的地图。我想首先按长度排序,如果字符串的长度相同,我想按字母排序。我写了那些代码:
String out = outMap.values().stream()
.sorted(Comparator.comparing(e -> e.length()).thenComparing()...)
.collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)
问题是,当我写thenComparing时,我不能使用e.length()了。我该如何解决?
编辑:Map<Character, String>。我想对所有字符串进行排序,并在输出中连接一个字符串。
我有返回的API,Map<String,String>需要将其转换为DTO。
SubjectIdAndNameDTO (id, name constructor args)
id
name
Run Code Online (Sandbox Code Playgroud)
当前的实现使用传统的for循环和Map.EnterSet。我如何使用Java8的功能来简单地执行以下代码。
Map<String, String> map = getSubjectIdAndNameMap();
// How can this code can be improved by using Java8 Stream and method references
List<SubjectIdAndNameDTO> subIdNameDTOList = new ArrayList<>();
for (Entry<String, String> keyset : map.entrySet()) {
SubjectIdAndNameDTO subjectIdNameDTO =
new SubjectIdAndNameDTO(keyset.getKey(), keyset.getValue());
subIdNameDTOList.add(subjectIdNameDTO);
}
Run Code Online (Sandbox Code Playgroud) 我有以下清单
[12_223,13_4356,15_5676]
我能够使用以下代码溢出下划线并将其转换为一个Hashmap
list.stream()
.map(s -> s.split("_"))
.collect(Collectors.toMap(
a -> a[0],
a -> a[1]));
Run Code Online (Sandbox Code Playgroud)
它给出了下面的地图
{"12"="223", "13"="4356", "15"="5676"}
但我想更改此代码,以便它给我一个像下面的地图列表,因为我可能会在分割时遇到重复的键
[{"12"="223"}, {"13"="4356"}, {"15"="5676"}]
我有一个Answer类和一个User类.
答案有一个getUser()和用户有一个getPoints()
从答案列表中我想得到一个按点排序的用户哈希集.我试过以下:
Set<User> collectSet = list.stream().map(Answer::getUser)
.sorted(Comparator.comparing(User::getPoints))
.collect(Collectors.toCollection(HashSet::new));
collectSet.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎没有保留顺序.输出总是不同的.
有趣的是,列表的相同示例可以正常工作
List<User> collectList = list.stream().map(Answer::getUser)
.sorted(Comparator.comparing(User::getPoints))
.collect(Collectors.toList());
collectList.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
如何使用Java Stream迭代List中的2个循环.
public class ArrayStreams {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(5);
list.add(7);
list.add(2);
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
System.out.println("i :" + list.get(i) + "J :" + list.get(j));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何将此代码转换为Java Stream.请帮忙!
我有一张静态地图:
private static final Map<SomeObject, AnotherObject> SOME_MAP = ...build map here...
Run Code Online (Sandbox Code Playgroud)
我正在尝试生成一个类型列表 List<AnotherObject>
这按预期工作:
List<AnotherObject> list = Stream.of(SOME_MAP.values())
.flatMap(Collection::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
由于非静态方法无法在静态上下文中引用,因此以下失败
List<AnotherObject> list = SOME_MAP.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
任何人都可以确切地解释第二个版本如何在第一个版本没有的情况下包含非静态方法错误?
这是一个具体的例子:
private static final Map<Integer, Integer> SOME_MAP = ImmutableMap.of(1, 2, 3, 4, 5, 6);
@Test
public void workingTest() {
List<Integer> list = Stream.of(SOME_MAP.values())
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(list); // prints out [2, 4, 6]
}
@Test
public void nonWorkingTest() {
List<Integer> list = SOME_MAP.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(list); // Fails before this.
}
Run Code Online (Sandbox Code Playgroud)
在失败的测试中,我收到以下错误:
Error:(79, …Run Code Online (Sandbox Code Playgroud) 我有一个String数组,我想使用Java 8流将其转换为BigInteger数组。
String[] output = bigSorting(new String[]{"31415926535897932384626433832795", "1", "4900146572543628830293235422623540449026979", "10", "57500297590012603652986133599394871645776460", "5",
"497010206818067722087306230802257700034825862515267073569769100385728461314", "57500297590012603652986133599394871645776460497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314"});
Object[] unsortedBigIntegerArr = convertFromStringArrayToBigIntegerArray(output);
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的方法,但是我无法获取BigInteger数组,但是却能够获取Object数组。
private static Object[] convertFromStringArrayToBigIntegerArray(String[] unsorted) {
return Arrays.stream(unsorted).map(BigSorting2::convertFromStringToBigInteger).toArray();
}
private static BigInteger convertFromStringToBigInteger(String unsorted) {
return new BigInteger(unsorted);
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以使用Java 8流完全完成它。
import java.util.stream.*;
import java.util.*;
class TestInfiniteStream {
public static void main(String args[]) {
IntStream infiniteStream = new Random().ints();
IntStream sortedStream = infiniteStream.sorted();
sortedStream.forEach(i -> System.out.println(i));
}
}
Run Code Online (Sandbox Code Playgroud)
编译并执行此代码后,出现以下错误。
Exception in thread "main" java.lang.IllegalArgumentException: Stream size exceeds max array size
Run Code Online (Sandbox Code Playgroud)
在无限流上排序流是否失败?
我正在努力从StringBuilder中删除一些字符.该方法工作正常.但是,我希望通过Java-8流API实现相同的功能.目前的代码很冗长.有没有办法通过Java 8流API重构第二个方法removeCarryReturnsCharacters()?
private static StringBuilder readEntireFileUsingStream(Path filePath) throws IOException {
StringBuilder data = new StringBuilder(String.valueOf(Files.readAllLines(filePath, StandardCharsets.ISO_8859_1)));
return removeCarryReturnsCharacters(data);
}
private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData){
int endIndex = 1012;
String needToRemove = "";
long totDataChunkCount = fileData.length()/1014;
long delCounter = 1;
try{
while (delCounter < totDataChunkCount) {
needToRemove = fileData.substring(endIndex, endIndex + 2);
if (needToRemove.equals("^^")) {
fileData.delete(endIndex, endIndex + 2);
}
endIndex += 1012;
delCounter++;
}
}catch(StringIndexOutOfBoundsException exp){
throw exp;
}
return fileData;
}
Run Code Online (Sandbox Code Playgroud)