Java 8 将Java8流式映射函数作为参数传递

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; }

我有一个逗号分隔的字符串,我想把它转换成数组。但是在某些情况下,我需要整数解析,有时需要双精度解析。 有没有一种方法可以让我通过mapToDouble或mapToInt,而不是重新编写整个内容

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]