一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java8通過Function獲取字段名的方法(獲取實(shí)體類的字段名稱)

Java8通過Function獲取字段名的方法(獲取實(shí)體類的字段名稱)

2022-01-24 01:01一抹微笑~ Java教程

Java8通過Function獲取字段名。不用再硬編碼,效果類似于mybatis-plus的LambdaQueryWrapper,對(duì)Java8通過Function獲取字段名相關(guān)知識(shí)感興趣的朋友一起看看吧

看似很雞肋其實(shí)在某些特殊場(chǎng)景還是比較有用的。
比如你將實(shí)體類轉(zhuǎn)Map或者拿到一個(gè)Map結(jié)果的時(shí)候,你是怎么獲取某個(gè)map的key和value。

方法一:

聲明 String key1="aaa"; key為 key1,value 為map.get(key1);

?
1
2
3
4
5
6
7
8
Map<String,Object> map=new HashMap<>();
        map.put("aaa",1);
 
        //獲取map的key 和value
        //key 為key1
        String key1="aaa";
        //value 為 map.get(key1)
        map.get(key1);

然后好像日常使用中也沒有其他的方法了,下面將帶來(lái)另外一種使用方法,話不多說直接上代碼[/code]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
import java.io.Serializable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Function;
 
/**
 * Java8通過Function函數(shù)獲取字段名稱(獲取實(shí)體類的字段名稱)
 * @see ColumnUtil#main(java.lang.String[]) 使用示例
 * @author jx
 */
public class ColumnUtil {
 
    /**
     * 使Function獲取序列化能力
     */
    @FunctionalInterface
    public interface SFunction<T, R> extends Function<T, R>, Serializable {
    }
 
    /**
     * 字段名注解,聲明表字段
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TableField {
        String value() default "";
    }
 
    //默認(rèn)配置
    static String defaultSplit = "";
    static Integer defaultToType = 0;
 
    /**
     * 獲取實(shí)體類的字段名稱(實(shí)體聲明的字段名稱)
     */
    public static <T> String getFieldName(SFunction<T, ?> fn) {
        return getFieldName(fn, defaultSplit);
    }
 
    /**
     * 獲取實(shí)體類的字段名稱
     * @param split 分隔符,多個(gè)字母自定義分隔符
     */
    public static <T> String getFieldName(SFunction<T, ?> fn, String split) {
        return getFieldName(fn, split, defaultToType);
    }
 
    /**
     * 獲取實(shí)體類的字段名稱
     * @param split 分隔符,多個(gè)字母自定義分隔符
     * @param toType 轉(zhuǎn)換方式,多個(gè)字母以大小寫方式返回 0.不做轉(zhuǎn)換 1.大寫 2.小寫
     */
    public static <T> String getFieldName(SFunction<T, ?> fn, String split, Integer toType) {
        SerializedLambda serializedLambda = getSerializedLambda(fn);
 
        // 從lambda信息取出method、field、class等
        String fieldName = serializedLambda.getImplMethodName().substring("get".length());
        fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase());
        Field field;
        try {
            field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName);
        } catch (ClassNotFoundException | NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
 
        // 從field取出字段名,可以根據(jù)實(shí)際情況調(diào)整
        TableField tableField = field.getAnnotation(TableField.class);
        if (tableField != null && tableField.value().length() > 0) {
            return tableField.value();
        } else {
 
            //0.不做轉(zhuǎn)換 1.大寫 2.小寫
            switch (toType) {
                case 1:
                    return fieldName.replaceAll("[A-Z]", split + "$0").toUpperCase();
                case 2:
                    return fieldName.replaceAll("[A-Z]", split + "$0").toLowerCase();
                default:
                    return fieldName.replaceAll("[A-Z]", split + "$0");
            }
 
        }
 
    }
 
    private static <T> SerializedLambda getSerializedLambda(SFunction<T, ?> fn) {
        // 從function取出序列化方法
        Method writeReplaceMethod;
        try {
            writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
 
        // 從序列化方法取出序列化的lambda信息
        boolean isAccessible = writeReplaceMethod.isAccessible();
        writeReplaceMethod.setAccessible(true);
        SerializedLambda serializedLambda;
        try {
            serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        writeReplaceMethod.setAccessible(isAccessible);
        return serializedLambda;
    }
 
 
    /**
     * 測(cè)試用戶實(shí)體類
     */
    public static class TestUserDemo implements Serializable {
 
        private static final long serialVersionUID = 1L;
 
        private String loginName;
        private String name;
        private String companySimpleName;
 
        @ColumnUtil.TableField("nick")
        private String nickName;
 
        public String getLoginName() {
            return loginName;
        }
 
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
 
        public String getNickName() {
            return nickName;
        }
 
        public void setNickName(String nickName) {
            this.nickName = nickName;
        }
 
        public static long getSerialVersionUID() {
            return serialVersionUID;
        }
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
        public String getCompanySimpleName() {
            return companySimpleName;
        }
 
        public void setCompanySimpleName(String companySimpleName) {
            this.companySimpleName = companySimpleName;
        }
    }
 
 
    /**
     * 參考示例
     */
    public static void main(String[] args) {
 
        //實(shí)體類原字段名稱返回
        System.out.println();
        System.out.println("實(shí)體類原字段名稱返回");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getLoginName));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getNickName));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName));
 
        System.out.println();
        System.out.println("實(shí)體類字段名稱增加分隔符");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_"));
 
        System.out.println();
        System.out.println("實(shí)體類字段名稱增加分隔符 + 大小寫");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 0));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 1));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 2));
 
 
    }
 
}

輸出結(jié)果:

Java8通過Function獲取字段名的方法(獲取實(shí)體類的字段名稱)

到此這篇關(guān)于Java8通過Function獲取字段名(獲取實(shí)體類的字段名稱)的文章就介紹到這了,更多相關(guān)Java8通過Function獲取字段名內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/IT-study/p/15351980.html

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒有升過級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
主站蜘蛛池模板: 亚洲欧美另类在线观看 | 暖暖视频高清图片免费完整版 | 8x在线永久成人影院 | 性做久久久久久久久老女人 | 色综合中文字幕天天在线 | 特色特色大片在线 | 三级午夜宅宅伦不卡在线 | 四虎影院在线免费观看 | 朝鲜女人性猛交 | 男人捅女人动漫 | 99久久999久久久综合精品涩 | 四虎影院永久网址 | 17岁韩国在线观看免费1 | 日韩人成 | 四虎永久在线精品免费影视 | 色婷婷影院在线视频免费播放 | 91精品国产免费久久国语蜜臀 | 九九热在线免费观看 | 我的家教老师 | 日本中文字幕一区二区高清在线 | 日本视频免费在线观看 | 天天做天天玩天天爽天天 | 国产精品va在线观看不 | 国产剧情麻豆刘玥视频 | 欧美a级完整在线观看 | 欧美同性video| 色一情一乱一伦 | 久久精品AV一区二区无码 | 亚洲国产精品自在在线观看 | 美琪美腿白丝交小说 | av中文字幕网免费观看 | 范冰冰a级一级特级毛片 | 日韩免费一区 | 国产高清自拍视频 | 韩国漂亮美女三级在线观看 | www.久久精品视频 | 99在线播放 | 无人影院在线播放 | 亚洲干综合 | 美女黄金大片视频免费看 | 精品欧美一区二区三区在线观看 |