Java 8 将Java8流式映射函数作为参数传递
我有一个逗号分隔的字符串,我想把它转换成数组。但是在某些情况下,我需要整数解析,有时需要双精度解析。 有没有一种方法可以让我通过mapToDouble或mapToInt,而不是重新编写整个内容Java 8 将Java8流式映射函数作为参数传递,java-8,java-stream,Java 8,Java Stream,我有一个逗号分隔的字符串,我想把它转换成数组。但是在某些情况下,我需要整数解析,有时需要双精度解析。 有没有一种方法可以让我通过mapToDouble或mapToInt,而不是重新编写整个内容 return Arrays.stream(test.split(",")).mapToDouble(x -> { if (StringUtils.isEmpty(x)) { return condition ? -1 : 0; }
return Arrays.stream(test.split(",")).mapToDouble(x -> {
if (StringUtils.isEmpty(x)) {
return condition ? -1 : 0;
}
return Double.parseDouble(x);
}).toArray();
return Arrays.stream(test.split(",")).mapToInt(x -> {
if (StringUtils.isEmpty(x)) {
return condition ? -1 : 0;
}
return Integer.parseInt(x);
}).toArray();
有没有一种方法可以把它变成一个函数,这样我就可以拥有一个泛型函数并存储相应的数组?有一种方法,但是您将不再使用原语,因为Java中的泛型不支持原语类型。相反,您可以使用
Integer
和Double
包装类型:
public static <T> T[] convert(
String test,
Function<String, T> parser,
boolean condition,
T ifConditionTrue,
T ifConditionFalse,
IntFunction<T[]> arrayGenerator) {
return Arrays.stream(test.split(","))
.map(x -> {
if (StringUtils.isEmpty(x)) {
return condition ? ifConditionTrue : ifConditionFalse;
}
return parser.apply(x);
})
.toArray(arrayGenerator);
}
您可以使用一个接受
String
的简单函数和一个将使用此函数转换每个字符串元素的函数来完成此操作。好消息是,此函数可能返回您想要的任何类型:Integer
、Double
、BigDecimal
、String
或任何其他您想要的类型。在下面的示例中,我使用的方法引用如下:
Integer::valueOf
将元素转换为Integer
值
Double::valueOf
将元素转换为Double
值
String::valueOf
将元素转换为String
值
考虑以下示例:
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ParsingStringTest {
public static void main(String[] args) {
String str = "1, , 3, 4, 5, , 7, sasd, aaa, 0";
List<Double> doubles = parse(str, Double::valueOf);
List<Integer> integers = parse(str, Integer::valueOf);
List<String> strings = parse(str, String::valueOf);
System.out.println(doubles);
System.out.println(integers);
System.out.println(strings);
Double[] array = doubles.toArray(new Double[doubles.size()]);
System.out.println(Arrays.toString(array));
}
public static <T> List<T> parse(String str, Function<String, T> parseFunction) {
return Arrays.stream(str.split(","))
.filter(s -> !s.isEmpty())
.map(s -> {
try {
return parseFunction.apply(s.trim());
} catch (Exception e) {}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
希望有帮助。您能粘贴整个stacktrace吗?您使用什么Java版本?我已经用OpenJDK1.8.0141对其进行了测试,下面是我的IDE视频:我消除了这个错误。我这样称呼它:Double[]result=parse(str,Double::valueOf);我得到一个错误:java.lang.ClassCastException:[Ljava.lang.Object;不能强制转换为[Ljava.lang.Double;这是因为.toArray()
返回Object[]
并且数组不能强制转换为其他简单的类。如果您想保持解决方案的简单性,我建议返回List
,而不是T[]
因为当您知道输入列表的大小和类型时,您总是可以简单地将列表转换为任何数组。这就是为什么Federico使用.toArray(T[])
method,但在这种情况下,您必须提供数组生成器功能。选择最适合您的,两个答案都很好。谢谢,我会尝试。在我的原始帖子中,我用1和0替换blank。在使用Double的情况下,是否可以将其设为1.0?就像再次将其设为通用函数一样?@user1692342是的,您始终可以提供一个cus修改输入的tom函数,例如。
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ParsingStringTest {
public static void main(String[] args) {
String str = "1, , 3, 4, 5, , 7, sasd, aaa, 0";
List<Double> doubles = parse(str, Double::valueOf);
List<Integer> integers = parse(str, Integer::valueOf);
List<String> strings = parse(str, String::valueOf);
System.out.println(doubles);
System.out.println(integers);
System.out.println(strings);
Double[] array = doubles.toArray(new Double[doubles.size()]);
System.out.println(Arrays.toString(array));
}
public static <T> List<T> parse(String str, Function<String, T> parseFunction) {
return Arrays.stream(str.split(","))
.filter(s -> !s.isEmpty())
.map(s -> {
try {
return parseFunction.apply(s.trim());
} catch (Exception e) {}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
[1.0, 3.0, 4.0, 5.0, 7.0, 0.0]
[1, 3, 4, 5, 7, 0]
[1, , 3, 4, 5, , 7, sasd, aaa, 0]
[1.0, 3.0, 4.0, 5.0, 7.0, 0.0]