質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

2903閲覧

AndroidでJava8の機能が利用できない

aglkjggg

総合スコア769

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

1クリップ

投稿2017/03/14 01:39

編集2017/03/14 02:52

###前提・実現したいこと
Personクラスを名前、年齢の2つのキーでソートをしたいです。
しかし、様々な方法を試しましたがすべてエラーになります。
どうにかしてソートする方法はありませんでしょうか。

また、Javaでも.NETのLINQのように書ければなぁ。。。と思っています。
いいライブラリ等ご存知でしたら教えてください><

###該当のソースコード

  • MainActivity.java

Java

1// Person クラス 2class Person { 3 public Person(String name, Integer age){ 4 this.name = name; 5 this.age = age; 6 } 7 8 private String name; 9 public String getName() { 10 return name; 11 } 12 13 private Integer age; 14 public Integer getAge() { 15 return age; 16 } 17} 18 19@Override 20protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 // persons にダミーデータを入れる 25 List<Person> persons = new ArrayList<>(); 26 persons.add(new Person("a", 3)); 27 persons.add(new Person("b", 2)); 28 persons.add(new Person("b", 4)); 29 persons.add(new Person("c", 1)); 30 31 // persons をソートする 32 persons.sort(comparing(Person::getName, reverseOrder()).thenComparing(Person::getAge)); 33 34 // 結果を出力する 35 for(Person p : persons) { 36 System.out.println(p.name + p.age); 37 } 38}

###発生している問題・エラーメッセージ

03-14 10:16:07.788 13100-13100/com.example.user01.myproject W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41c33638) 03-14 10:16:07.798 13100-13100/com.example.user01.myproject E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.user01.myproject, PID: 13100 java.lang.NoClassDefFoundError: com/example/user01/myproject/-$Lambda$0 com.example.user01.myproject.MainActivity.onCreate(MainActivity.java:42) android.app.Activity.performCreate(Activity.java:5246) android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) android.app.ActivityThread.access$800(ActivityThread.java:144) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) android.os.Handler.dispatchMessage(Handler.java:102) android.os.Looper.loop(Looper.java:136) android.app.ActivityThread.main(ActivityThread.java:5179) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:515) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614) de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.user01.myproject.-$Lambda$0" on path: DexPathList[[zip file "/data/app/com.example.user01.myproject-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.user01.myproject-2, /vendor/lib, /system/lib]] dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) java.lang.ClassLoader.loadClass(ClassLoader.java:497) java.lang.ClassLoader.loadClass(ClassLoader.java:457) com.example.user01.myproject.MainActivity.onCreate(MainActivity.java:42)  android.app.Activity.performCreate(Activity.java:5246)  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)  android.app.ActivityThread.access$800(ActivityThread.java:144)  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)  android.os.Handler.dispatchMessage(Handler.java:102)  android.os.Looper.loop(Looper.java:136)  android.app.ActivityThread.main(ActivityThread.java:5179)  java.lang.reflect.Method.invokeNative(Native Method)  java.lang.reflect.Method.invoke(Method.java:515)  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614)  de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)  dalvik.system.NativeStart.main(Native Method) 

###試したこと

  • Lightweight-Stream-APIの利用

Android 7.0が最低条件となるので使えなかった。
Android 4.4以上の端末で動くアプリを作りたい。

  • IxJavaの利用

問題なく動作した。
しかし、orderByは存在するが、thenByが存在しない為
複数キーでのソートができなかった。

  • jLinqerの利用

以下のエラーが出てコンパイルができなかった。

Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Predicate Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Predicate Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Function Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.Comparator Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.Comparator Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.Comparator Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.Comparator Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Predicate Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Iterable

###補足情報(言語/FW/ツール等のバージョンなど)

  • Android Studio 2.3
  • Java 8を使用(こちらを参考にしました。)

https://developer.android.com/guide/platform/j8-jack.html?hl=ja

  • JDK 1.8.0_121
  • JRE 1.8.0_121
  • アプリ動作テスト端末 Android 4.4(KitKat)

###2017/03/14 AM 11:52追記
情報追加
コードを一切変更せずに 以下の端末でテストしましたので結果を追加します。

Android API LevelAndroid Version結果
236.0NG
247.0OK
257.1OK
KiyoshiMotoki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Lightweight-Stream-API + RetroLambdaの環境なら、低いAPIでも動きそう?
RetroLambdaを使う場合は、Jackが使えないのでそこらへんはいじる必要ありそう。

投稿2017/03/14 03:00

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aglkjggg

2017/03/14 06:59 編集

■Google等から検索してきた人用まとめ 結論からすると Android 4.x.x でも Lightweight-Stream-API だけで動作確認ができました。 import static com.annimon.stream.ComparatorCompat.*; する必要がありました。 Gradleは以下の設定をしました。 compile 'com.annimon:stream:1.1.6' 詳しくは この下でabs123様とのやりとりを参照してください。 ご回答ありがとうございます。 以下の記事を参考にLSA + RetroLambdaを導入した所動作しました。 (作者もLSAと略しているようですので、LSAと略させていただきました。) http://qiita.com/kojionilk/items/2795dcc2307a13abe1c1 しかし、ThenBy に相当するものが無い為複数キーでのソートが出来ませんでした。 persons = Stream.of(persons) .sortBy(Person::getName) .sortBy(Person::getAge) .toList(); この結果が c1 b2 b3 b4 となってしまいます。
abs123

2017/03/14 05:02

スタティックメソッドとして用意されているみたいですね 書くとしたらこんな感じでしょうか。 .sorted(thenComparing(comparing(Person::getName, reverseOrder()), comparing(Person::getAge)))
aglkjggg

2017/03/14 05:26 編集

Stream.of(persons) .sorted(comparing(Person::getName)); 試しにこちらの短めのコードを動かしてみると再びLambdaエラーが出てきました。 sortBy は動くのですがsortedが何故か動きませんでした。。。><
abs123

2017/03/14 05:41

何がスタティックインポートされているか、確認してください。 java.util.Collections.reverseOrder; java.util.Comparator.comparing; こいつらがいるとエラーが出ると思います。 代わりとなるのは、下記のものです。 com.annimon.stream.ComparatorCompat.comparing; com.annimon.stream.ComparatorCompat.reverseOrder;
aglkjggg

2017/03/14 06:51 編集

ありがとうございます>< Javaについての理解が足りてませんでした。。 import static com.annimon.stream.ComparatorCompat.*; に修正した所、目的のソートが実現できました>< ※追記 RetroLambdaは不要で、LSAだけで動作しました。 LSAが動作しないと勘違いしていたのは先程も指摘していただいた import するものが間違っていたからでした。
guest

0

ラムダ式が正しく処理されてない感じですね。
でも JDK 1.8 でコンパイルしている(でなければそもそもラムダ式のコンパイルができない)のですから、実行ランタイム側がラムダ式対応になってない、のかな。

参考にされた Web ページにあるように、Jack がきちんと設定されてコンパイルに使用されているのか、くらいですかね。

投稿2017/03/14 02:28

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aglkjggg

2017/03/14 03:03 編集

ご回答ありがとうございます。 読み直したところ、気になる文章があったので検証して追記します。 以下、引用します。 ------------------------------ Android では Java 8 の全言語機能はサポートしていません。 ただし、Android 7.0(API レベル 24)向けにアプリを開発している場合は、次の機能を使用できます。 (中略) 以前のバージョンの Android でラムダ式、メソッド参照、タイプ アノテーションをテストするには、 build.gradle ファイルで compileSdkVersion と targetSdkVersion を 23 以下に指定します。 ------------------------------ https://developer.android.com/guide/platform/j8-jack.html?hl=ja
aglkjggg

2017/03/14 03:38 編集

結論からするとダメでした。 以下が試した手順です。 ■1. Android 6.0 (Marshmallow)(Android API Level 23)用SDK をインストール ■2. compileSdkVersion と targetSdkVersionを 23に変更 ■3. compile 'com.android.support:appcompat-v7:25.x.x' を compile 'com.android.support:appcompat-v7:23+' に修正 ■4. jackOptions{ enabled true } を追加 Java8の機能が使えなくなり、コンパイルが成功しなくなった。 http://i.imgur.com/iW0H0Xj.png ※エラー対処 Error:No resource identifier found for attribute 'roundIcon' in package 'android' というエラーが出たので、 AndroidManifest.xmlの android:roundIcon="@mipmap/ic_launcher_round" の1行を削除した。
tacsheaven

2017/03/14 04:00 編集

Jack ツールチェーンの設定をしてないのでは? …と思ったけど、jack ツールチェーンは Android 6.0 から標準扱いだったっけか…… あとは build.gradle で compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } を指定していないとか?
aglkjggg

2017/03/14 04:23

再度確認しましたが指定しておりました。 念のためプログラムとbuild.gradleをすべて貼り付けます。 また、今までWindows で試していたのですが、 macOSに1からAndroidStudio をインストールして同様のことを試しましたが、 全く同じエラー(lambdaのエラーが出る)が再現されてうまく動きませんでした。 ・build.gradle https://gist.github.com/anonymous/c806436be2c565ddf04d1d8f7c32ce59MainActivity.java https://gist.github.com/anonymous/099320997c8b4d62dcdafc2663f87175
guest

0

java

1persons.sort(comparing(Person::getName, reverseOrder()).thenComparing(Person::getAge));

このままで動いたけど。

投稿2017/03/14 02:19

fuzzball

総合スコア16733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/03/14 02:21

あー、ごめん。Androidでの話か。
fuzzball

2017/03/14 02:42 編集

Android StudioでもGradleの設定をすればそのままのコードで動きました。
aglkjggg

2017/03/14 02:54 編集

ご回答ありがとうございます。 お手数をおかけします…>< ご利用されているのはAndroid 7.0以上でしょうか? 私の環境でエミュレータを作成して試したところ、 Android 7.0未満はエラーが出てしまうということがわかりまして…
fuzzball

2017/03/14 04:07

全部エミュレータですが 7o 6x 5x 4x でした。失礼しました。
aglkjggg

2017/03/14 04:27

ありがとうございます。 やはりAndroid 7.xは動作可で、それ以下となると動作不可になるのですね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問