我正在阅读文档StringBuffer,特别是reverse()方法.该文件提到了代理人对的一些内容.在这种情况下,什么是代理对?什么是低和高代理人?
现在我正在做
for (char c = 'a'; c <= 'z'; c++) {
alphabet[c - 'a'] = c;
}
Run Code Online (Sandbox Code Playgroud)
但是有更好的方法吗?与Scala相似'a' to 'z'
我想将包含的字符串转换为字符abc列表和字符的哈希集.我怎么能用Java做到这一点?
List<Character> charList = new ArrayList<Character>("abc".toCharArray());
Run Code Online (Sandbox Code Playgroud) 在经历将原始数组转换为 Streams 的方法时,我发现char[]不支持,而支持其他原始数组类型。有什么特别的理由将它们排除在流中吗?
从char数组,我想构建一个流来使用java 8功能,如过滤器和地图.
char[] list = {'a','c','e'};
Stream<Character> cStream = Stream.of(list);
// Stream<Character> cStream = Arrays.stream(list);
Run Code Online (Sandbox Code Playgroud)
第一种方法不起作用(原因:将cStream更改为Stream<char[]>).注释行也不起作用(原因:stream(T[])类型数组中的方法不适用于arguments(char[])).
我知道如果char[] list更改为int[],一切正常使用IntStream.但我不希望每次转换char[]到int[]每个时间或更改到一个列表中,当我需要在使用流库char阵列.
我发现这个问题是从java String中获取java.util.streams.IntStream但是我现在还没有找到这个方法,因为我使用的是Java 8.
更正:正如你们所指出的那样,我使用的是Java 7.现在方法chars()就在那里.但问题仍然适用:
如何Stream<Character>从字符串中获取?
我可以用这样的代码进行转换:
Object[] array = (Object[]) message.get(key);
boolean[] result = new boolean[array.length];
for (int i = 0; i < array.length; i++) {
result[i] = (boolean) array[i];
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为可以使用Java 8流进行相同的转换.我开始编写这样的代码:
boolean[] = Arrays.stream(array)
.map(Boolean.class::cast)
.map(Boolean::booleanValue)
.toArray()
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用.编译说
incompatible types: java.lang.Object[] cannot be converted to boolean[]
Run Code Online (Sandbox Code Playgroud)
我试图了解代码的问题.我认为这map(Boolean::booleanValue)将返回我可以收集的布尔值流toArray.
Java 8具有java.util.stream.Stream和java.util.stream.IntStream类型.java.util.Arrays有一个方法
IntStream is = Arrays.stream(int[])
Run Code Online (Sandbox Code Playgroud)
但是没有这样的方法可以从byte [],short []或char []创建IntStream,将每个元素扩展为int.是否有一种从byte []创建IntStream的惯用/首选方法,所以我可以以函数方式操作字节数组?
我当然可以手动将byte []转换为int []并使用Arrays.stream(int []),或者使用IntStream.Builder:
public static IntStream stream(byte[] bytes) {
IntStream.Builder isb = IntStream.builder();
for (byte b: bytes)
isb.add((int) b);
return isb.build();
}
Run Code Online (Sandbox Code Playgroud)
但是由于复制了源代码,它们都不是很有用.
似乎没有一种简单的方法可以将InputStream(或者在本例中为ByteArrayInputStream)转换为IntStream,这对于在功能上处理InputStream非常有用.(明显遗漏?)
是否有更有效且不复制的功能方式?
Java 8引入了流.原语有三个流(IntStream(of int),LongStream(of long),DoubleStream(of double))和对象的通用流.
我假设没有FloatStream,CharStream,ByteStream或ShortStream,因为它们都是现有流的"子类型".也就是说,一个流short可以使每个元素容易转换为int.
但为什么没有BooleanStream?
我已经读过这篇相关的帖子了.在String操作方面,溪流似乎吸引了大量的仪式.如果要将String解析为可能需要执行某些操作的字符流,则需要将它们转换为IntStream第一个,映射到Object,然后转换为intto char,最后转换为charto String然后返回它.
人们说,命令式的节目编程有一个仪式开销.如果我完全做错了,请纠正我.我的目的不是嘲笑,而是更好地理解Java流,因为我一般都很欣赏它们.
// Simple method which encrypts all chars in a string
String input = "Hel!lo";
String result = input.chars() // Need to convert into an IntStream
.mapToObj(e -> Character.toUpperCase((char) e)) // Need to map to Object (!) and then cast to char
.map(CryptoMath::encryptChar) // Calling the encryption
.map(String::valueOf) // Need to cast to String again...
.collect(joining("")); // Finally done
System.out.println(result);
Run Code Online (Sandbox Code Playgroud) 在我的示例中,我尝试根据一系列字符创建一个ASCII表。我设法用a List字符串完成了操作,但是用了一个char数组失败了。
我收到Character::hashCode无法解决的错误Collectors.toMap()。
Error:(26, 17) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Map<java.lang.Object,java.lang.Object>>
reason: cannot infer type-variable(s) R
(actual and formal argument lists differ in length)
Error:(26, 42) java: incompatible types: cannot infer type-variable(s) T,K,U,T
(argument mismatch; invalid method reference
incompatible types: java.lang.Object cannot be converted to char)
Run Code Online (Sandbox Code Playgroud)
有办法吗?
public class JavaCollectToMapEx2 {
public static void main(String[] args) {
// list of ASCII characters
var …Run Code Online (Sandbox Code Playgroud) 为什么Java 8没有StringStream和CharStream.
StringStream.of("String1","String2");
StringStream.concat(stream1,stream2);
StringStream.builder().add("String1").add("string2").accept("string3");
Run Code Online (Sandbox Code Playgroud)