ファイル「s」を解析した後、AttributeGet:1,16,10106,10111
したがって、attributeIDGetリストのコロンの後にすべての数値を取得する必要があります。いくつかの方法があります。しかし、できる方法はありますか直接変換List<String>
からList<Integer>
。以下のコードは型の不一致について文句を言うので、私はInteger.parseIntを実行しようとしましたが、これはリストでは機能しないと思います。ここでsは文字列です。
private static List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
いいえ、配列をループする必要があります
for(String s : strList) intList.add(Integer.valueOf(s));
Java8の使用:
stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
ラムダを使用:
strList.stream().map(org.Apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());
グアバコンバーター トリックを行います。
import com.google.common.base.Splitter;
import com.google.common.primitives.Longs;
final Iterable<Long> longIds =
Longs.stringConverter().convertAll(
Splitter.on(',').trimResults().omitEmptyStrings()
.splitToList("1,2,3"));
いいえ、各要素を反復処理する必要があります。
for(String number : numbers) {
numberList.add(Integer.parseInt(number));
}
これが発生する理由は、あるタイプのリストをその他タイプに変換する簡単な方法がないためです。一部の変換は不可能であるか、特定の方法で実行する必要があります。基本的に、変換は関連するオブジェクトと変換のコンテキストに依存するため、「1つのサイズですべてに適合する」ソリューションはありません。たとえば、Car
オブジェクトとPerson
オブジェクトがある場合はどうでしょう。 List<Car>
をList<Person>
に直接変換することはできません。実際には意味がありません。
Google Guavaライブラリ を使用する場合は、これを行うことができます。 Lists#transform を参照してください。
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(","));
attributeIDGet =
Lists.transform(attributeIDGetS, new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
};
});
}
うん、肥大しているがスタイリッシュな上記の答えに同意する。しかし、それは別の方法です。
なぜストリームを使用して文字列のリストを整数のリストに変換しないのですか?以下のような
List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40",
"50", "60", "70"));
List<Integer> integerList = stringList.stream()
.map(Integer::valueOf).collect(Collectors.toList());
完全な操作は次のようになります
String s = "AttributeGet:1,16,10106,10111";
List<Integer> integerList = (s.startsWith("AttributeGet:")) ?
Arrays.asList(s.replace("AttributeGet:", "").split(","))
.stream().map(Integer::valueOf).collect(Collectors.toList())
: new ArrayList<Integer>();
Java 8のラムダを使用できる場合は、次のコードサンプルを使用できます。
final String text = "1:2:3:4:5";
final List<Integer> list = Arrays.asList(text.split(":")).stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
System.out.println(list);
外部ライブラリを使用しません。平野 古い 新しいJava!
Java 8のLambda関数を使用して、ループせずにこれを実現できます。
String string = "1, 2, 3, 4";
List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
いいえ、Javaでそれを行う方法(私が知っていること)はありません。
基本的に、各エントリを文字列から整数に変換する必要があります。
探しているものは、より機能的な言語で実現できます。変換関数を渡して、リストのすべての要素に適用できます。しかし、それは不可能です(リストのすべての要素に適用されます) )。
オーバーキル:
ただし、Google Guavaの関数(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html)を使用して、より機能的なアプローチをシミュレートできます。あなたが探しているものです。
リストを2回反復することが心配な場合は、splitの代わりにTokenizerを使用して、リストに追加する前に各整数トークンをIntegerに変換します。
StreamsおよびLambdaの使用:
newIntegerlist = listName.stream().map(x->
Integer.valueOf(x)).collect(Collectors.toList());
上記のコード行は、タイプList<String>
のリストをList<Integer>
に変換します。
お役に立てば幸いです。
私のリポジトリでコードを検討できます。
https://github.com/mohamedanees6/JavaUtils/wiki/CollectionUtils
castStringCollection(Collection<T>,Class)
グアバの力を示す別の例です。これは私がコードを書く方法ではありませんが、GuavaがJavaに提供する機能的なプログラミングの種類を示すためにすべてをまとめたいと思いました。
Function<String, Integer> strToInt=new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
}
};
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet =(s.contains("AttributeGet:"))?
FluentIterable
.from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1))
.transform(strToInt)
.toImmutableList():
new ArrayList<Integer>();