我有一个,Map<String,List<String>>并希望将其变成,Map<String,List<Long>>因为String列表中的每个代表一个Long:
Map<String,List<String>> input = ...;
Map<String,List<Long>> output=
input.entrySet()
.stream()
.collect(toMap(Entry::getKey, e -> e.getValue().stream()
.map(Long::valueOf)
.collect(toList()))
);
Run Code Online (Sandbox Code Playgroud)
我主要的问题是每个人String可能不能正确代表一个Long; 可能有一些问题。Long::valueOf可能会引发例外。如果是这种情况,我想返回一个null或空Map<String,List<Long>>
因为我想遍历这张output地图。但是我不能接受任何错误转换。甚至没有一个。关于如何在不正确的String-> Long转换的情况下如何返回空输出的任何想法?
有一些情况我需要将字符串转换为浮点数或其他一些数值数据类型,但有可能获得一些不可转换的值,如" - "或"/",我无法预先验证所有值以删除他们.我想避免使用try/catch这个问题,还有其他方法在java中进行正确的转换吗?类似于C#的东西TryParse?
这将是一个快速的一个安全的字符串转换为数值型的方式,而当转换失败提供一个默认值?
我尝试使用通常推荐的方法,即使用Exceptions:
implicit class StringConversion(val s: String) {
private def toTypeOrElse[T](convert: String=>T, defaultVal: T) = try {
convert(s)
} catch {
case _: NumberFormatException => defaultVal
}
def toShortOrElse(defaultVal: Short = 0) = toTypeOrElse[Short](_.toShort, defaultVal)
def toByteOrElse(defaultVal: Byte = 0) = toTypeOrElse[Byte](_.toByte, defaultVal)
def toIntOrElse(defaultVal: Int = 0) = toTypeOrElse[Int](_.toInt, defaultVal)
def toDoubleOrElse(defaultVal: Double = 0D) = toTypeOrElse[Double](_.toDouble, defaultVal)
def toLongOrElse(defaultVal: Long = 0L) = toTypeOrElse[Long](_.toLong, defaultVal)
def toFloatOrElse(defaultVal: Float = 0F) = toTypeOrElse[Float](_.toFloat, defaultVal)
} …Run Code Online (Sandbox Code Playgroud) 我喜欢java中的String to Int中的建议- 可能是错误的数据,需要避免异常来实现解析int的实用程序方法,但如果无法解析字符串则返回默认值.
public static int parseInt(String s, int defaultValue) {
if (s == null) return defaultValue;
try {
return Integer.parseInt(s);
} catch (NumberFormatException x) {
return defaultValue;
}
}
Run Code Online (Sandbox Code Playgroud)
是否存在一个现有的开源库(例如来自apache commons,或google),它实现了这个以及其他数据类型,如boolean,float,double,long等?