集合Lambda式の詳細
14144 ワード
#集合Lambda式
言語:
サーバー开発に适する:JAVA.net pht c++ c# asp golang python…
フロントエンド:ios android H 5 jsp...
データベース:mysql oracle BD 2 Hbase MonggoDB redis,sql sever...
ビッグデータ:hadoop flume spark hive yarn zonokeeprer kafka sqoop,HDFS mr,scala...
Lambda式:
抽象的な方法のインタフェースは1つだけで、java 8の新しい特性、javaは関数式のプログラミングができて、同時性能の上で実質的な1歩を踏み出しました.
Lambdaと匿名内部クラスの比較(lambdaは単純な匿名内部クラス)
1.匿名内部クラスは任意のインタフェースのインスタンスを作成することができ、インタフェースがどれだけの抽象メソッドを含んでいるかにかかわらず、匿名内部クラスがすべての抽象メソッドを実現すればよい.ただし、Lambda式は関数インタフェースのインスタンスのみを作成できます(抽象的な方法は1つしかありません).
2.匿名内部クラスは、抽象クラス、さらには一般クラスのインスタンスを作成することができる.ただし、Lambda式は関数インタフェースのインスタンスのみを作成できます.
3.匿名内部クラス実装の抽象メソッドのメソッドボディは、インタフェースで定義されたデフォルトメソッドを呼び出すことを許可する.ただし、Lambda式のコードブロックでは、インタフェースのデフォルトメソッドを呼び出すことはできません.
基本構文
1.構成:(パラメータ)->式or(パラメータ)->メソッド;
2.パラメトリックリスト:パラメトリックリストでは、パラメトリックタイプを省略できます.パラメトリックリストにパラメータが1つしかない場合は、パラメトリックリストのカッコでもコードを省略できます.
3.矢印(->):英語のダッシュ記号と記号より大きい記号で構成する必要があります
4.コードブロック:コードブロックに文が1つしか含まれていない場合、lambda式ではコードブロックのカッコを省略できます.この文はカッコで文の終了を表さないでください.
5.戻り値:lambdaコードブロックにはreturn文が1つしかなく、returnキーワードを省略することもできます.(lambda式は値を返す必要がありますが、そのコードブロックにはreturnを省略した文が1つしかありません.lambda式はこの文の結果を自動的に返します)
6.lambda式は直接関数のパラメータとして使用でき、1つのインタフェースしかない抽象関数を実現する場合は、lambda式を使用するとより柔軟になります.
7.lambda式タイプ:その定義は、明示的に宣言された抽象的な方法が1つしかない場合、関数インタフェースです.一般的に@FunctionalInterfaceで表記されています(マークしなくてもいいです)、関数式インタフェースは
複数のdefaultメソッドまたはstaticメソッドが含まれていますが、抽象メソッドは1つしか宣言できません.(注記)@FuctionalInterfaceの主な役割は、現在のインタフェースが関数インタフェースであるかどうかを確認することです.
8.グローバル変数の場合はそのまま使用する.ローカル変数の場合、finalがデフォルトで追加されます(ローカル変数がローカル内部クラスで使用されている場合と同様に定数として使用されます).
メソッドリファレンスとコンストラクタリファレンス
1.参照クラスメソッド
2.特定のオブジェクトを参照するインスタンスメソッド
3.クラスオブジェクトを参照する方法
4.参照構造
しゅうごう
コレクションは、参照データ型を格納し、異なるデータ型を格納します.
集合と配列
1.配列:異なるタイプの複数のデータを格納でき、データ型は単純なデータ型であっても参照データ型であってもよい.
欠点:作成したのは1つの定値で、固定の長さのデータしか保存することができなくて、いったんいっぱい保存したら、更に記憶を継続することができません
2.コレクション:異なるタイプの複数のデータを格納できますが、参照データ型のみを格納できます.
欠点:参照データ型のみ格納
利点:ストレージ領域は、ストレージデータの増大に伴って増大します.メモリ容量の合理的な活用
分類:
-Collection:---インタフェース
List–-インタフェース
ArrayList-クラス
Vector------クラス
LinKedList–クラス
Set----インタフェース
HasSet----クラス
TreeSet-----クラス
-Map:-インタフェース
hashMap-クラス
TreeSet–クラス
ArrayList
方法:
1.追加:collection.add(“java”);
2.削除:boolean remove(Object o);void clear() clear !=null//clear()が完了したらデータを保存できます
3.判断:boolean contains(Object o)//最下位はequals、Object o呼び出しのequals
4.判断:boolean isEmpty()/集合が空かどうかを判断!=null
5.集合変配列:集合変配列:他の人に集合長を変えることを望まない場合.Object[] objects = collection.toArray();
遍歴:コレクションに異なるタイプのデータが同時に存在する場合、フォールトトレランス処理とダウンシフトが必要である.
1.反復器遍歴:
hasnext():現在位置に要素があるかどうかを判断し、ある場合はTRUEに戻り、ない場合はfalseに戻る
next();現在の位置の値を取り出し、ポインタを1つ後ろに移動します.
**反復の取得:1.オブジェクト2を作成する.コレクションにバインド
Iterator iterator()/コレクション内のオブジェクトの取得
コードの例:
while (iterator1.hasNext()) {
Object object = iterator1.next();//マルチステート
if(object instanceof String){//フォールトトレランス処理
System.out.println(“iterator2:”+object);
}
}
2.列挙器遍歴:
Enumeration enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
Object object = (Object) enumeration.nextElement();
System.out.println(object);
}
List set比較
1.List:アクセスされたデータは秩序化されており(要素の格納順序は要素を追加する順序と一致する)、繰り返すことができる
ArrayList;最下位は配列で、スレッドは安全で、特徴:検索速度が速く、追加削除速度が遅い.
Vector:下位層のデータ構造は配列であり、スレッドは安全である.特徴:検索速度が速く、追加削除速度が遅い
LinkedList:下位はチェーンテーブルで、スレッドは安全ではありません.特徴:検索速度が遅く、削除速度が速い.
2.Set:格納されているデータ型は無秩序であり、繰り返してはならない.
List常用方法:
1.増加:
void add(int index, E element)
boolean addAll()
2.削除
E remove(int index)/削除した要素を返す
3.修正
E set(int index, E element)
4.検索(反復)を同時に変更するには、ループ時に要素を追加します.
ListIterator listIteator(int index)
反復器の使用中にlistの削除方法で直接要素を削除すると、エラーが発生する可能性がありますので、そうしないでください.
vector
1.遍歴するときは列挙器を使う.
Enumeration enumeration = vector.elements();
while(enumeration.hasMoreElements()){
Object object = (Object) enumeration.nextElement();
System.out.println(object);
}
LindedList
1.addFirst();はじめに
2.addLast();末尾から追加
3.getFirst();
4.removeFirst()
5.removeLast()
JDK 1から6が表示されます.
1.offerFirst()/値の保存
2.offerLast()
3.peekFirst()/オブジェクトが存在しない場合はNULLを返します
4.peekLast()
5.pollFirst()/削除したオブジェクトが存在しない場合NULLを返します
6.pollLast()
Setは繰り返すことができなくて、無秩序です
1.HashSet:最下位はハッシュテーブルであり、スレッドは安全ではない
2.TreeSet:最下位はツリーで、スレッドは安全ではありません
HashSet
1.原理:要素のhashCodeとequalsメソッドを呼び出すことによって重量除去を実現し、まずhashCodeメソッドを呼び出し、現在のオブジェクトのハッシュコード値を取得し、2つのオブジェクトのハッシュコード値を比較させ、異なる場合、直接2つのオブジェクトと見なし、equalsメソッドを呼び出さない場合、trueを返して1つのオブジェクトとみなす.逆に2つの対象とする.
2.hashCodeを呼び出してからequalsを調整し、
質問:hashCode()を書き換えるのはなぜですか?繰り返すために
TreeSetではソートとデマンドが可能
Comparableインタフェースの実装:自然ソート
1.TreeSetのaddメソッドはソートを実現し、重さを除去し、要素を呼び出すCompareToメソッド(StringはCompareToインタフェースを実現した)
2.Comparebleインタフェースを実装していないオブジェクトはTreeSetの要素として使用できません.そうしないと、ClassCastExceptionが例外として報告されます.
3.CompareToは0を返して1つの要素しかありません.は、1を返します.-1逆順
4.インスタンスコード:
ComparatorインタフェースComparatorインタフェース:手動ソート
手順:
1.コンパレータクラスを作成する:Comparatorを実装する
2.コンパレータオブジェクトを作成するには:
3.TreeSetにコンパレータオブジェクトを渡す:
注意:手動ソートの優先度はデフォルトのソートより高い
汎用型
1.本来の集合は任意の参照タイプを保持することができるが、後期には誤り処理を許容し、下に転換しなければならない.汎用型は上の問題を解決するために、集合の中に何が残っているのかをはっきりさせるためです.
2.エラー検出を実行フェーズからコンパイルフェーズに移行しました.セキュリティと効率性の向上
原理:以前add()の戻り値はobjectであったが,加算後add()の戻り値はStringである.
注意:汎用使用:クラス、メソッド、インタフェース
1.定義されたタイプに相当します.汎用タイプが決定されると、タイプが決定されます.
1.クラスで汎用を使用
2.方法に汎用型を用いる:汎用型は使用時に一度に複数を定義ことができる.区切る
1.メソッド上の汎用とクラス上の汎用を一致させる
class Dog{
//1.メソッド上の汎用性はクラス上の汎用性と一致する
public void eat(F f) {
System.out.println(f);
}
}
2.方法の上で独立して汎型を使う:注意:汎型は使う前に必ず先に定義を行って、定義の方式:現在の方法の一番前に追加して、作用:方法と方法内の汎型を一致させる
public void song(E e) {
ArrayList arrayList = new ArrayList<>();
System.out.println(e);
}
3.静的メソッドで汎用を使用する:独立して使用する必要があります.方法:staticの後に汎用を定義します.
3.インタフェースで汎用型を使用する:インタフェースを実現するサブクラスでの汎用型がどのように使用されるかを主に研究する.
1.サブクラス上の汎用型とインタフェース上の一致:クラス上の汎用型が確定し、インタフェース上の汎用型が確定し、方法上の汎用型が確定した
2.インタフェースでは汎用型を使用し、サブクラスでは汎用型を使用しない:実装されたインタフェースの位置に特定の汎用型を指定する必要がある
###制限上限と制限ラインオフ
言語:
サーバー开発に适する:JAVA.net pht c++ c# asp golang python…
フロントエンド:ios android H 5 jsp...
データベース:mysql oracle BD 2 Hbase MonggoDB redis,sql sever...
ビッグデータ:hadoop flume spark hive yarn zonokeeprer kafka sqoop,HDFS mr,scala...
Lambda式:
抽象的な方法のインタフェースは1つだけで、java 8の新しい特性、javaは関数式のプログラミングができて、同時性能の上で実質的な1歩を踏み出しました.
Lambdaと匿名内部クラスの比較(lambdaは単純な匿名内部クラス)
1.匿名内部クラスは任意のインタフェースのインスタンスを作成することができ、インタフェースがどれだけの抽象メソッドを含んでいるかにかかわらず、匿名内部クラスがすべての抽象メソッドを実現すればよい.ただし、Lambda式は関数インタフェースのインスタンスのみを作成できます(抽象的な方法は1つしかありません).
2.匿名内部クラスは、抽象クラス、さらには一般クラスのインスタンスを作成することができる.ただし、Lambda式は関数インタフェースのインスタンスのみを作成できます.
3.匿名内部クラス実装の抽象メソッドのメソッドボディは、インタフェースで定義されたデフォルトメソッドを呼び出すことを許可する.ただし、Lambda式のコードブロックでは、インタフェースのデフォルトメソッドを呼び出すことはできません.
基本構文
1.構成:(パラメータ)->式or(パラメータ)->メソッド;
2.パラメトリックリスト:パラメトリックリストでは、パラメトリックタイプを省略できます.パラメトリックリストにパラメータが1つしかない場合は、パラメトリックリストのカッコでもコードを省略できます.
3.矢印(->):英語のダッシュ記号と記号より大きい記号で構成する必要があります
4.コードブロック:コードブロックに文が1つしか含まれていない場合、lambda式ではコードブロックのカッコを省略できます.この文はカッコで文の終了を表さないでください.
5.戻り値:lambdaコードブロックにはreturn文が1つしかなく、returnキーワードを省略することもできます.(lambda式は値を返す必要がありますが、そのコードブロックにはreturnを省略した文が1つしかありません.lambda式はこの文の結果を自動的に返します)
6.lambda式は直接関数のパラメータとして使用でき、1つのインタフェースしかない抽象関数を実現する場合は、lambda式を使用するとより柔軟になります.
7.lambda式タイプ:その定義は、明示的に宣言された抽象的な方法が1つしかない場合、関数インタフェースです.一般的に@FunctionalInterfaceで表記されています(マークしなくてもいいです)、関数式インタフェースは
複数のdefaultメソッドまたはstaticメソッドが含まれていますが、抽象メソッドは1つしか宣言できません.(注記)@FuctionalInterfaceの主な役割は、現在のインタフェースが関数インタフェースであるかどうかを確認することです.
8.グローバル変数の場合はそのまま使用する.ローカル変数の場合、finalがデフォルトで追加されます(ローカル変数がローカル内部クラスで使用されている場合と同様に定数として使用されます).
メソッドリファレンスとコンストラクタリファレンス
1.参照クラスメソッド
//* 1.
interface Converter{
//
Integer convert(String value);
}
class Test1{
public static void fun1() {
//
Converter converter = value->Integer.valueOf(value);
Integer v1 = converter.convert("222");
System.out.println(v1);
//
//
// :: , lambda
Converter converter2 = Integer::valueOf;
Integer v2 = converter2.convert("333");
System.out.println(v2);
}
}
2.特定のオブジェクトを参照するインスタンスメソッド
//* 2.
interface IA{
public void show(String message);
}
class A{
public void play(String i) {
System.out.println(" A play"+" i:"+i);
}
}
class Test2{
public static void fun2() {
//
IA ia = message->new A().play(message);
ia.show("hello");
//
IA ia2 = new A()::play;
ia2.show("world");
}
}
3.クラスオブジェクトを参照する方法
//* 3.
interface IB{
String subString(String string,int stat,int end);
}
class Test3{
public static void fun3() {
//
IB ib = (string,stat,end)->string.substring(stat, end);
String sub1 = ib.subString("hello world", 2, 4);
System.out.println(sub1);
//
// ,
IB ib2 = String::substring;
String sub2 = ib2.subString("class is over", 2, 5);
System.out.println(sub2);
}
}
4.参照構造
interface IC{
Object show(String name,int age);
}
class Person{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
class Test4{
public static void fun4() {
IC ic = (name,age)->new Person(name, age);
Object per = ic.show("bing", 19);
System.out.println(per);
//
// lambda ,
IC ic2 = Person::new;
Object per1 = ic2.show("chen", 10);
System.out.println(per1);
}
}
しゅうごう
コレクションは、参照データ型を格納し、異なるデータ型を格納します.
集合と配列
1.配列:異なるタイプの複数のデータを格納でき、データ型は単純なデータ型であっても参照データ型であってもよい.
欠点:作成したのは1つの定値で、固定の長さのデータしか保存することができなくて、いったんいっぱい保存したら、更に記憶を継続することができません
2.コレクション:異なるタイプの複数のデータを格納できますが、参照データ型のみを格納できます.
欠点:参照データ型のみ格納
利点:ストレージ領域は、ストレージデータの増大に伴って増大します.メモリ容量の合理的な活用
分類:
-Collection:---インタフェース
List–-インタフェース
ArrayList-クラス
Vector------クラス
LinKedList–クラス
Set----インタフェース
HasSet----クラス
TreeSet-----クラス
-Map:-インタフェース
hashMap-クラス
TreeSet–クラス
ArrayList
方法:
1.追加:collection.add(“java”);
2.削除:boolean remove(Object o);void clear() clear !=null//clear()が完了したらデータを保存できます
3.判断:boolean contains(Object o)//最下位はequals、Object o呼び出しのequals
4.判断:boolean isEmpty()/集合が空かどうかを判断!=null
5.集合変配列:集合変配列:他の人に集合長を変えることを望まない場合.Object[] objects = collection.toArray();
遍歴:コレクションに異なるタイプのデータが同時に存在する場合、フォールトトレランス処理とダウンシフトが必要である.
1.反復器遍歴:
hasnext():現在位置に要素があるかどうかを判断し、ある場合はTRUEに戻り、ない場合はfalseに戻る
next();現在の位置の値を取り出し、ポインタを1つ後ろに移動します.
**反復の取得:1.オブジェクト2を作成する.コレクションにバインド
Iterator iterator()/コレクション内のオブジェクトの取得
コードの例:
while (iterator1.hasNext()) {
Object object = iterator1.next();//マルチステート
if(object instanceof String){//フォールトトレランス処理
System.out.println(“iterator2:”+object);
}
}
2.列挙器遍歴:
Enumeration enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
Object object = (Object) enumeration.nextElement();
System.out.println(object);
}
List set比較
1.List:アクセスされたデータは秩序化されており(要素の格納順序は要素を追加する順序と一致する)、繰り返すことができる
ArrayList;最下位は配列で、スレッドは安全で、特徴:検索速度が速く、追加削除速度が遅い.
Vector:下位層のデータ構造は配列であり、スレッドは安全である.特徴:検索速度が速く、追加削除速度が遅い
LinkedList:下位はチェーンテーブルで、スレッドは安全ではありません.特徴:検索速度が遅く、削除速度が速い.
2.Set:格納されているデータ型は無秩序であり、繰り返してはならない.
List常用方法:
1.増加:
void add(int index, E element)
boolean addAll()
2.削除
E remove(int index)/削除した要素を返す
3.修正
E set(int index, E element)
4.検索(反復)を同時に変更するには、ループ時に要素を追加します.
ListIterator listIteator(int index)
public static void test(List list) {
//
ListIterator listIterator = list.listIterator();
//
while (listIterator.hasNext()) {
String object = (String) listIterator.next();
System.out.println(" :"+object);
}
//
while (listIterator.hasPrevious()) {
String object = (String)listIterator.previous();
System.out.println(" :"+object);
}
// add,set,remove ,
//
while (listIterator.hasNext()) {
String object = (String) listIterator.next();
if (object.equals("haha")) {
// , list , ,
//list.remove(object);
// remove
// , :remove,add,set
listIterator.remove();
}
System.out.println(" :"+object);
}
}
反復器の使用中にlistの削除方法で直接要素を削除すると、エラーが発生する可能性がありますので、そうしないでください.
vector
1.遍歴するときは列挙器を使う.
Enumeration enumeration = vector.elements();
while(enumeration.hasMoreElements()){
Object object = (Object) enumeration.nextElement();
System.out.println(object);
}
LindedList
1.addFirst();はじめに
2.addLast();末尾から追加
3.getFirst();
4.removeFirst()
5.removeLast()
JDK 1から6が表示されます.
1.offerFirst()/値の保存
2.offerLast()
3.peekFirst()/オブジェクトが存在しない場合はNULLを返します
4.peekLast()
5.pollFirst()/削除したオブジェクトが存在しない場合NULLを返します
6.pollLast()
Setは繰り返すことができなくて、無秩序です
1.HashSet:最下位はハッシュテーブルであり、スレッドは安全ではない
2.TreeSet:最下位はツリーで、スレッドは安全ではありません
HashSet
1.原理:要素のhashCodeとequalsメソッドを呼び出すことによって重量除去を実現し、まずhashCodeメソッドを呼び出し、現在のオブジェクトのハッシュコード値を取得し、2つのオブジェクトのハッシュコード値を比較させ、異なる場合、直接2つのオブジェクトと見なし、equalsメソッドを呼び出さない場合、trueを返して1つのオブジェクトとみなす.逆に2つの対象とする.
2.hashCodeを呼び出してからequalsを調整し、
質問:hashCode()を書き換えるのはなぜですか?繰り返すために
TreeSetではソートとデマンドが可能
Comparableインタフェースの実装:自然ソート
1.TreeSetのaddメソッドはソートを実現し、重さを除去し、要素を呼び出すCompareToメソッド(StringはCompareToインタフェースを実現した)
2.Comparebleインタフェースを実装していないオブジェクトはTreeSetの要素として使用できません.そうしないと、ClassCastExceptionが例外として報告されます.
3.CompareToは0を返して1つの要素しかありません.は、1を返します.-1逆順
4.インスタンスコード:
@Override
public int compareTo(Object o) {
//
//
//
if (!(o instanceof Person2)) {
throw new ClassCastException(" ");
}
//
Person2 person2 = (Person2)o;
//
int num = this.name.compareTo(person2.name);//String CompareTO,
//
return num==0?this.age-person2.age:num;
}
ComparatorインタフェースComparatorインタフェース:手動ソート
手順:
1.コンパレータクラスを作成する:Comparatorを実装する
lass ComStrWithLength implements Comparator{
@Override
public int compare(Object o1, Object o2) {
//
if (!(o1 instanceof String)) {
throw new ClassCastException(" ");
}
if (!(o2 instanceof String)) {
throw new ClassCastException(" ");
}
//
String s1 = (String)o1;
String s2 = (String)o2;
//
int num = s1.length()-s2.length();
// ,
return num==0?s1.compareTo(s2):num;
}
}
2.コンパレータオブジェクトを作成するには:
ComStrWithLength comStrWithLength = new ComStrWithLength();
3.TreeSetにコンパレータオブジェクトを渡す:
Set set = new TreeSet<>(comStrWithLength);
注意:手動ソートの優先度はデフォルトのソートより高い
汎用型
1.本来の集合は任意の参照タイプを保持することができるが、後期には誤り処理を許容し、下に転換しなければならない.汎用型は上の問題を解決するために、集合の中に何が残っているのかをはっきりさせるためです.
2.エラー検出を実行フェーズからコンパイルフェーズに移行しました.セキュリティと効率性の向上
原理:以前add()の戻り値はobjectであったが,加算後add()の戻り値はStringである.
注意:汎用使用:クラス、メソッド、インタフェース
1.定義されたタイプに相当します.汎用タイプが決定されると、タイプが決定されます.
1.クラスで汎用を使用
class Student1{
E tools;
public E getTools() {
return tools;
}
public void setTools(E tools) {
this.tools = tools;
}
}
2.方法に汎用型を用いる:汎用型は使用時に一度に複数を定義ことができる.区切る
1.メソッド上の汎用とクラス上の汎用を一致させる
class Dog{
//1.メソッド上の汎用性はクラス上の汎用性と一致する
public void eat(F f) {
System.out.println(f);
}
}
2.方法の上で独立して汎型を使う:注意:汎型は使う前に必ず先に定義を行って、定義の方式:現在の方法の一番前に追加して、作用:方法と方法内の汎型を一致させる
public void song(E e) {
ArrayList arrayList = new ArrayList<>();
System.out.println(e);
}
3.静的メソッドで汎用を使用する:独立して使用する必要があります.方法:staticの後に汎用を定義します.
public static void show(W w) {}
3.インタフェースで汎用型を使用する:インタフェースを実現するサブクラスでの汎用型がどのように使用されるかを主に研究する.
1.サブクラス上の汎用型とインタフェース上の一致:クラス上の汎用型が確定し、インタフェース上の汎用型が確定し、方法上の汎用型が確定した
2.インタフェースでは汎用型を使用し、サブクラスでは汎用型を使用しない:実装されたインタフェースの位置に特定の汎用型を指定する必要がある
interface Inte{
public void show(E e);
}
//1.
/* , ,
*/
class Pig implements Inte{
@Override
public void show(E e) {
System.out.println(e);
}
}
//2. ,
/*
*
* :
* 1. ,
* 2. , ,
*/
class Bird implements Inte{
public void show(String e) {};
}
###制限上限と制限ラインオフ
/*
* java ?
1) ?: , ,
2) sql select * from emp where name=? :
3) , .
// Object ?
Class> class1 = Object.class;
// ? . , Object , .
Test> test = new Test();
//test.run(new Object());
class Test{
T e;
public T run(T a) {
T t = null;
return t;
}
}
*/
/*
* :
*
* ?: ,
* : extends E>: <> E,<> E E
* : super E>:: <> E,<> E E
*
*
* : extends E>
*/
public class Demo14
{
public static void main(String[] args) {
//
ArrayList list1 = new ArrayList<>();
list1.add(new Student2("bingbing", 1));
// : Student2 Person1 ,
bianli(list1);
ArrayList list2 = new ArrayList<>();
list2.add(new Teacher("bingbing", 1));
// : Teacher1 Person1 ,
bianli(list2);
ArrayList list3 = new ArrayList<>();
list3.add(new Person4("bingbing", 1));
//
bianli(list3);
ArrayList