最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java函數(shù)作為參數(shù)的傳遞與使用常見問題及避坑指南

 更新時(shí)間:2025年09月22日 16:19:00   作者:AA-代碼批發(fā)V哥  
Java通過接口+實(shí)現(xiàn)類實(shí)現(xiàn)函數(shù)參數(shù)化,Java8引入Lambda簡化寫法,提升靈活性與復(fù)用性,適用于集合處理、事件監(jiān)聽等場景,但需注意有效final變量和代碼可讀性

Java中“函數(shù)作為參數(shù)傳遞”是實(shí)現(xiàn)“行為參數(shù)化”的核心方式,它能讓代碼更靈活、復(fù)用性更強(qiáng),與C、Python等語言直接傳遞函數(shù)不同,Java通過“接口+實(shí)現(xiàn)類”的方式間接實(shí)現(xiàn)這一功能,尤其在Java 8引入Lambda表達(dá)式后,寫法更加簡潔。

一、為什么需要“函數(shù)作為參數(shù)”?

在傳統(tǒng)編程中,若要實(shí)現(xiàn)“相似邏輯但不同行為”的功能,往往需要重復(fù)編寫代碼。例如:實(shí)現(xiàn)一個“數(shù)組處理”工具,既能過濾出偶數(shù),又能過濾出大于10的數(shù)。

1.1 傳統(tǒng)方式的問題(代碼冗余)

/**
 * 傳統(tǒng)方式:過濾數(shù)組
 * 問題:邏輯相似但行為不同時(shí),需重復(fù)編寫代碼
 */
public class ArrayHandler {
    // 過濾偶數(shù)
    public static int[] filterEvenNumbers(int[] array) {
        int[] result = new int[array.length];
        int index = 0;
        for (int num : array) {
            if (num % 2 == 0) { // 核心判斷:偶數(shù)
                result[index++] = num;
            }
        }
        return Arrays.copyOf(result, index);
    }
    // 過濾大于10的數(shù)
    public static int[] filterNumbersGreaterThan10(int[] array) {
        int[] result = new int[array.length];
        int index = 0;
        for (int num : array) {
            if (num > 10) { // 核心判斷:大于10
                result[index++] = num;
            }
        }
        return Arrays.copyOf(result, index);
    }
}

問題分析

  • 兩段代碼的“框架邏輯”(遍歷數(shù)組、存儲結(jié)果)完全相同,僅“判斷條件”不同;
  • 若需要新增過濾規(guī)則(如過濾質(zhì)數(shù)),需再寫一個幾乎相同的方法,代碼冗余嚴(yán)重;
  • 維護(hù)成本高:若框架邏輯需要修改(如優(yōu)化存儲方式),所有方法都要同步修改。

1.2 “函數(shù)作為參數(shù)”的優(yōu)勢

若能將“判斷邏輯”作為參數(shù)傳遞給框架方法,就能避免重復(fù)代碼。例如:

// 框架方法:接收“判斷邏輯”作為參數(shù)
public static int[] filter(int[] array, FilterRule rule) {
    // 框架邏輯(遍歷、存儲)
    int[] result = new int[array.length];
    int index = 0;
    for (int num : array) {
        if (rule.test(num)) { // 調(diào)用傳遞進(jìn)來的“判斷邏輯”
            result[index++] = num;
        }
    }
    return Arrays.copyOf(result, index);
}

使用時(shí)只需傳遞不同的“判斷邏輯”:

// 過濾偶數(shù):傳遞“偶數(shù)判斷”邏輯
int[] evens = filter(array, num -> num % 2 == 0);
// 過濾大于10的數(shù):傳遞“大于10判斷”邏輯
int[] greaterThan10 = filter(array, num -> num > 10);

核心優(yōu)勢

  • 行為參數(shù)化:框架邏輯固定,行為(如判斷條件)通過參數(shù)動態(tài)傳入;
  • 代碼復(fù)用:框架方法只需寫一次,不同行為通過參數(shù)擴(kuò)展;
  • 靈活性高:新增功能時(shí)無需修改原有代碼,只需新增“行為實(shí)現(xiàn)”;
  • 可讀性強(qiáng):通過Lambda表達(dá)式,行為邏輯一目了然。

二、Java中函數(shù)傳遞的核心:函數(shù)式接口

Java是“面向?qū)ο?rdquo;語言,無法直接傳遞函數(shù),但可以通過“接口+實(shí)現(xiàn)類”的方式間接傳遞——將函數(shù)邏輯封裝到接口的實(shí)現(xiàn)類中,再將實(shí)現(xiàn)類對象作為參數(shù)傳遞。

2.1 函數(shù)式接口的定義

能用于“函數(shù)傳遞”的接口必須是“函數(shù)式接口”——即只包含一個抽象方法的接口(可包含默認(rèn)方法、靜態(tài)方法)。這種接口的實(shí)例可以代表一個“函數(shù)”。

/**
 * 函數(shù)式接口示例:定義“過濾規(guī)則”
 * 只包含一個抽象方法test,用于封裝“判斷邏輯”
 */
@FunctionalInterface // 標(biāo)記為函數(shù)式接口(可選,編譯器會校驗(yàn))
interface FilterRule {
    // 抽象方法:接收int參數(shù),返回boolean(判斷結(jié)果)
    boolean test(int num);
    // 允許包含默認(rèn)方法(非抽象)
    default void printRule() {
        System.out.println("執(zhí)行過濾規(guī)則");
    }
}

關(guān)鍵說明

  • @FunctionalInterface注解是可選的,但加上后編譯器會強(qiáng)制檢查接口是否符合“只有一個抽象方法”的規(guī)則;
  • 函數(shù)式接口的抽象方法簽名(參數(shù)+返回值)決定了“可傳遞的函數(shù)類型”(如FilterRule可傳遞“接收int、返回boolean”的函數(shù))。

2.2 通過“接口實(shí)現(xiàn)類”傳遞函數(shù)

早期Java(8之前)通過“匿名內(nèi)部類”實(shí)現(xiàn)函數(shù)傳遞,步驟如下:

步驟1:定義函數(shù)式接口

// 函數(shù)式接口:封裝“字符串處理”邏輯
@FunctionalInterface
interface StringProcessor {
    String process(String str);
}

步驟2:編寫接收接口參數(shù)的方法

/**
 * 框架方法:接收StringProcessor對象(封裝了處理邏輯)
 */
public static String handleString(String str, StringProcessor processor) {
    // 調(diào)用接口方法(執(zhí)行傳遞進(jìn)來的函數(shù)邏輯)
    return processor.process(str);
}

步驟3:通過匿名內(nèi)部類傳遞函數(shù)邏輯

public static void main(String[] args) {
    String str = "  hello world  ";
    // 1. 傳遞“去除空格”邏輯(匿名內(nèi)部類)
    String trimmed = handleString(str, new StringProcessor() {
        @Override
        public String process(String s) {
            return s.trim(); // 去除首尾空格
        }
    });
    // 2. 傳遞“轉(zhuǎn)大寫”邏輯(匿名內(nèi)部類)
    String upper = handleString(str, new StringProcessor() {
        @Override
        public String process(String s) {
            return s.toUpperCase(); // 轉(zhuǎn)為大寫
        }
    });
    System.out.println(trimmed); // 輸出:hello world
    System.out.println(upper);   // 輸出:  HELLO WORLD  
}

原理:匿名內(nèi)部類的process方法實(shí)現(xiàn)了具體的函數(shù)邏輯,將該對象作為參數(shù)傳遞給handleString,就相當(dāng)于傳遞了process方法中的邏輯。

2.3 Java 8+:通過Lambda表達(dá)式簡化傳遞

Java 8引入的Lambda表達(dá)式可以簡化函數(shù)式接口實(shí)現(xiàn)類的創(chuàng)建,無需編寫匿名內(nèi)部類的冗余代碼。

Lambda表達(dá)式的基本語法

(參數(shù)列表) -> { 函數(shù)體 }
  • 若參數(shù)只有一個,可省略參數(shù)列表的括號(如num -> num % 2 == 0);
  • 若函數(shù)體只有一行代碼,可省略大括號和return(自動返回結(jié)果);
  • 類型可省略(編譯器自動推斷)。

使用Lambda傳遞函數(shù)

用Lambda表達(dá)式簡化上述StringProcessor的使用:

public static void main(String[] args) {
    String str = "  hello world  ";
    // 1. 傳遞“去除空格”邏輯(Lambda簡化)
    String trimmed = handleString(str, s -> s.trim());
    // 2. 傳遞“轉(zhuǎn)大寫”邏輯(Lambda簡化)
    String upper = handleString(str, s -> s.toUpperCase());
    // 3. 復(fù)雜邏輯(多行代碼):需加{}和return
    String processed = handleString(str, s -> {
        String temp = s.trim();
        return temp.substring(0, 5); // 截取前5個字符
    });
    System.out.println(processed); // 輸出:hello
}

對比匿名內(nèi)部類與Lambda

  • 匿名內(nèi)部類:代碼冗余,但兼容性好(支持所有Java版本);
  • Lambda表達(dá)式:代碼簡潔(一行搞定),僅支持Java 8及以上。

三、Java內(nèi)置的函數(shù)式接口

Java 8在java.util.function包中提供了常用的函數(shù)式接口,無需自定義即可直接使用,覆蓋大部分函數(shù)場景。

3.1 四大核心函數(shù)式接口

接口名抽象方法功能描述示例場景
Consumer<T>void accept(T t)接收T類型參數(shù),無返回值(消費(fèi)數(shù)據(jù))打印數(shù)據(jù)、修改對象屬性
Supplier<T>T get()無參數(shù),返回T類型結(jié)果(提供數(shù)據(jù))生成隨機(jī)數(shù)、創(chuàng)建對象
Function<T,R>R apply(T t)接收T類型參數(shù),返回R類型結(jié)果數(shù)據(jù)轉(zhuǎn)換(如String→Integer)
Predicate<T>boolean test(T t)接收T類型參數(shù),返回boolean(判斷)過濾數(shù)據(jù)、條件校驗(yàn)

3.2 內(nèi)置接口的使用示例

3.2.1 Consumer:消費(fèi)數(shù)據(jù)

用于“接收數(shù)據(jù)并處理(無返回值)”,如打印、存儲等。

import java.util.function.Consumer;
public class ConsumerDemo {
    // 框架方法:接收數(shù)據(jù)和處理邏輯
    public static void processData(String data, Consumer<String> consumer) {
        consumer.accept(data); // 執(zhí)行傳遞的處理邏輯
    }
    public static void main(String[] args) {
        // 1. 傳遞“打印數(shù)據(jù)”邏輯
        processData("hello", s -> System.out.println("打?。? + s));
        // 2. 傳遞“拼接前綴”邏輯(無返回值,僅處理)
        processData("world", s -> {
            String result = "前綴_" + s;
            System.out.println("處理后:" + result);
        });
    }
}

3.2.2 Function<T,R>:數(shù)據(jù)轉(zhuǎn)換

用于“接收一種類型數(shù)據(jù),返回另一種類型數(shù)據(jù)”,如類型轉(zhuǎn)換、格式處理。

import java.util.function.Function;
public class FunctionDemo {
    // 框架方法:接收數(shù)據(jù)和轉(zhuǎn)換邏輯
    public static <R> R transform(String data, Function<String, R> function) {
        return function.apply(data); // 執(zhí)行轉(zhuǎn)換邏輯
    }
    public static void main(String[] args) {
        // 1. 轉(zhuǎn)換為Integer(字符串轉(zhuǎn)數(shù)字)
        Integer num = transform("123", s -> Integer.parseInt(s));
        // 2. 轉(zhuǎn)換為長度(字符串→整數(shù))
        Integer length = transform("hello", s -> s.length());
        // 3. 轉(zhuǎn)換為大寫(字符串→字符串)
        String upper = transform("hello", s -> s.toUpperCase());
    }
}

3.2.3 Predicate:條件判斷

用于“接收數(shù)據(jù)并返回布爾值”,如過濾、校驗(yàn)。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateDemo {
    // 框架方法:過濾集合
    public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
        List<T> result = new ArrayList<>();
        for (T item : list) {
            if (predicate.test(item)) { // 執(zhí)行判斷邏輯
                result.add(item);
            }
        }
        return result;
    }
    public static void main(String[] args) {
        List<String> list = List.of("a", "bb", "ccc", "dddd");
        // 1. 過濾長度>2的字符串
        List<String> longStrs = filter(list, s -> s.length() > 2);
        System.out.println(longStrs); // 輸出:[ccc, dddd]
        // 2. 過濾包含"c"的字符串
        List<String> hasC = filter(list, s -> s.contains("c"));
        System.out.println(hasC); // 輸出:[ccc]
    }
}

3.3 其他常用接口

除四大核心接口外,Java還提供了針對基本類型的接口(避免自動裝箱)和雙參數(shù)接口:

接口名抽象方法功能描述
IntConsumervoid accept(int value)接收int參數(shù)(避免int→Integer裝箱)
LongPredicateboolean test(long value)接收long參數(shù),返回boolean
BiFunction<T,U,R>R apply(T t, U u)接收兩個參數(shù)(T和U),返回R
BiConsumer<T,U>void accept(T t, U u)接收兩個參數(shù),無返回值

四、實(shí)戰(zhàn):函數(shù)作為參數(shù)的典型應(yīng)用場景

4.1 集合處理(過濾、轉(zhuǎn)換)

集合的遍歷、過濾、轉(zhuǎn)換是函數(shù)傳遞的高頻場景,Java 8的StreamAPI大量使用了這種方式。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
            new User("張三", 20),
            new User("李四", 17),
            new User("王五", 25)
        );
        // 1. 過濾成年用戶(年齡≥18):傳遞Predicate<User>
        List<User> adults = users.stream()
            .filter(user -> user.getAge() >= 18) // 傳遞過濾邏輯
            .collect(Collectors.toList());
        // 2. 提取用戶名(轉(zhuǎn)換為String列表):傳遞Function<User,String>
        List<String> names = users.stream()
            .map(user -> user.getName()) // 傳遞轉(zhuǎn)換邏輯
            .collect(Collectors.toList());
        // 3. 打印用戶信息:傳遞Consumer<User>
        users.forEach(user -> System.out.println(user.getName() + ":" + user.getAge()));
    }
    // 實(shí)體類
    static class User {
        private String name;
        private int age;
        // 構(gòu)造器、getter
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() { return name; }
        public int getAge() { return age; }
    }
}

4.2 事件監(jiān)聽(回調(diào)函數(shù))

在GUI編程或異步處理中,“回調(diào)函數(shù)”(事件發(fā)生時(shí)執(zhí)行的邏輯)通常通過函數(shù)傳遞實(shí)現(xiàn)。

import java.util.Scanner;
/**
 * 模擬按鈕點(diǎn)擊事件:點(diǎn)擊后執(zhí)行傳遞的邏輯
 */
public class EventDemo {
    // 按鈕類:接收“點(diǎn)擊事件處理邏輯”
    static class Button {
        // 存儲回調(diào)函數(shù)(點(diǎn)擊時(shí)執(zhí)行)
        private Runnable onClick;
        // 設(shè)置點(diǎn)擊事件邏輯(接收Runnable函數(shù)式接口)
        public void setOnClick(Runnable onClick) {
            this.onClick = onClick;
        }
        // 模擬點(diǎn)擊(觸發(fā)回調(diào))
        public void click() {
            if (onClick != null) {
                onClick.run(); // 執(zhí)行傳遞的邏輯
            }
        }
    }
    public static void main(String[] args) {
        Button button = new Button();
        // 設(shè)置點(diǎn)擊邏輯(傳遞Runnable函數(shù))
        button.setOnClick(() -> {
            System.out.println("按鈕被點(diǎn)擊!");
            System.out.println("執(zhí)行提交表單邏輯...");
        });
        // 模擬用戶點(diǎn)擊
        System.out.println("請輸入任意字符模擬點(diǎn)擊:");
        new Scanner(System.in).next(); // 等待輸入
        button.click(); // 輸出點(diǎn)擊邏輯
    }
}

4.3 通用工具類(行為參數(shù)化)

編寫通用工具時(shí),通過函數(shù)傳遞行為可大幅提升工具的靈活性。例如:定義一個“數(shù)據(jù)校驗(yàn)工具”,支持不同校驗(yàn)規(guī)則。

import java.util.function.Predicate;
/**
 * 通用校驗(yàn)工具:支持不同校驗(yàn)規(guī)則
 */
public class Validator<T> {
    // 校驗(yàn)數(shù)據(jù):接收數(shù)據(jù)和校驗(yàn)規(guī)則
    public boolean validate(T data, Predicate<T> rule) {
        return rule.test(data);
    }
    public static void main(String[] args) {
        Validator<String> stringValidator = new Validator<>();
        // 1. 校驗(yàn)字符串非空
        boolean notEmpty = stringValidator.validate("test", s -> s != null && !s.isEmpty());
        // 2. 校驗(yàn)字符串長度≥6
        boolean minLength6 = stringValidator.validate("123456", s -> s.length() >= 6);
        // 3. 校驗(yàn)手機(jī)號(簡單規(guī)則)
        boolean isPhone = stringValidator.validate("13800138000", 
            s -> s.matches("1[3-9]\\d{9}"));
    }
}

五、常見問題與避坑指南

5.1 函數(shù)式接口必須“只有一個抽象方法”

錯誤:定義的接口包含多個抽象方法,無法用Lambda表達(dá)式實(shí)例化。

// 錯誤:包含兩個抽象方法,不是函數(shù)式接口
interface MyInterface {
    void method1();
    void method2(); // 第二個抽象方法
}
// 編譯報(bào)錯:Lambda表達(dá)式無法匹配多個抽象方法
MyInterface obj = () -> System.out.println("test");

解決方案:確保接口只有一個抽象方法,多余的方法可改為默認(rèn)方法或靜態(tài)方法。

5.2 Lambda表達(dá)式中變量的“有效final”

Lambda表達(dá)式中引用的外部變量必須是“有效final”(即聲明后未被修改)。

public class LambdaVariableDemo {
    public static void main(String[] args) {
        int count = 0; // 外部變量
        // 錯誤:在Lambda中修改外部變量
        Runnable runnable = () -> {
            count++; // 編譯報(bào)錯:變量count必須是final或有效final
        };
    }
}

原因:Lambda表達(dá)式可能在另一個線程中執(zhí)行,變量修改會導(dǎo)致線程安全問題。

解決方案

  • 若需修改變量,可使用原子類(如AtomicInteger);
  • 將變量封裝到對象中,修改對象的屬性(對象引用不變)。

5.3 避免過度使用Lambda導(dǎo)致可讀性下降

Lambda表達(dá)式適合簡短邏輯(1-2行代碼),復(fù)雜邏輯若用Lambda會降低可讀性。

// 不推薦:復(fù)雜邏輯用Lambda,可讀性差
Function<String, String> complexFunction = s -> {
    String temp = s.trim();
    if (temp.length() > 10) {
        temp = temp.substring(0, 10);
    }
    return temp.toUpperCase();
};

解決方案:復(fù)雜邏輯建議用單獨(dú)的方法實(shí)現(xiàn),再通過方法引用傳遞。

// 推薦:復(fù)雜邏輯單獨(dú)定義
public static String processString(String s) {
    String temp = s.trim();
    if (temp.length() > 10) {
        temp = temp.substring(0, 10);
    }
    return temp.toUpperCase();
}
// 通過方法引用傳遞(::表示引用方法)
Function<String, String> complexFunction = LambdaDemo::processString;

5.4 方法引用的正確使用

方法引用(類名::方法名)是Lambda的簡化寫法,但需確保方法簽名與函數(shù)式接口的抽象方法匹配。

// 函數(shù)式接口:接收String,返回int
interface StringToInt {
    int convert(String s);
}
public class MethodReferenceDemo {
    // 方法:簽名(String→int)與StringToInt匹配
    public static int stringToLength(String s) {
        return s.length();
    }
    public static void main(String[] args) {
        // 方法引用:直接引用stringToLength方法
        StringToInt converter = MethodReferenceDemo::stringToLength;
        int length = converter.convert("hello"); // 輸出:5
    }
}

注意:方法引用的方法參數(shù)類型、返回值類型必須與函數(shù)式接口的抽象方法完全匹配。

總結(jié)

  1. 代碼靈活性:通過傳遞不同函數(shù),動態(tài)改變方法的行為,無需修改原有邏輯;
  2. 代碼復(fù)用:框架方法只需實(shí)現(xiàn)一次,行為通過參數(shù)擴(kuò)展;
  3. 可讀性提升:Lambda表達(dá)式讓行為邏輯直觀可見,代碼更簡潔;
  4. 符合開閉原則:新增功能時(shí)無需修改原有代碼,只需新增函數(shù)實(shí)現(xiàn)。

從早期的匿名內(nèi)部類到Java 8的Lambda表達(dá)式,函數(shù)傳遞的寫法越來越簡潔,但核心原理始終是“函數(shù)式接口+實(shí)現(xiàn)類”,實(shí)際開發(fā)中,應(yīng)優(yōu)先使用Java內(nèi)置的函數(shù)式接口(如Predicate、Function),避免重復(fù)定義;復(fù)雜邏輯建議單獨(dú)定義方法,通過方法引用傳遞,平衡簡潔性和可讀性。

到此這篇關(guān)于Java函數(shù)作為參數(shù)的傳遞與使用常見問題及避坑指南的文章就介紹到這了,更多相關(guān)java函數(shù)參數(shù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程池隊(duì)列PriorityBlockingQueue原理分析

    Java線程池隊(duì)列PriorityBlockingQueue原理分析

    這篇文章主要介紹了Java線程池隊(duì)列PriorityBlockingQueue原理分析,PriorityBlockingQueue隊(duì)列是?JDK1.5?的時(shí)候出來的一個阻塞隊(duì)列,但是該隊(duì)列入隊(duì)的時(shí)候是不會阻塞的,永遠(yuǎn)會加到隊(duì)尾,需要的朋友可以參考下
    2023-12-12
  • Springboot集成Jasypt實(shí)現(xiàn)配置文件加密的方法

    Springboot集成Jasypt實(shí)現(xiàn)配置文件加密的方法

    Jasypt是一個java庫,它允許開發(fā)員以最少的努力為他/她的項(xiàng)目添加基本的加密功能,并且不需要對加密工作原理有深入的了解,這篇文章主要介紹了Springboot集成Jasypt實(shí)現(xiàn)配置文件加密,需要的朋友可以參考下
    2023-04-04
  • SpringBoot為何可以使用Jar包啟動詳解

    SpringBoot為何可以使用Jar包啟動詳解

    springboot jar包啟動腳本,適用于快速啟動,刪除,重啟,以及查看狀態(tài),下面這篇文章主要給大家介紹了關(guān)于SpringBoot為何可以使用Jar包啟動的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • java獲取request中的參數(shù)以及java解析URL問號后的參數(shù)

    java獲取request中的參數(shù)以及java解析URL問號后的參數(shù)

    這篇文章主要介紹了java獲取request中的參數(shù)以及java解析URL問號后的參數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java原生服務(wù)器接收上傳文件 不使用MultipartFile類

    Java原生服務(wù)器接收上傳文件 不使用MultipartFile類

    這篇文章主要為大家詳細(xì)介紹了Java原生服務(wù)器接收上傳文件,不使用MultipartFile類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實(shí)現(xiàn)

    SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級評論功能

    SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級評論功能

    本文介紹了如何使用SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級評論功能,同時(shí)提供了數(shù)據(jù)庫的設(shè)計(jì)和詳細(xì)的后端代碼,前端界面使用的Vue2,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-05-05
  • java實(shí)現(xiàn)騰訊ocr圖片識別接口調(diào)用

    java實(shí)現(xiàn)騰訊ocr圖片識別接口調(diào)用

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)騰訊ocr圖片識別接口調(diào)用,拍車牌識別車牌號功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 三種java編程方法實(shí)現(xiàn)斐波那契數(shù)列

    三種java編程方法實(shí)現(xiàn)斐波那契數(shù)列

    這篇文章主要為大家詳細(xì)介紹了三種java編程方法實(shí)現(xiàn)斐波那契數(shù)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java聊天室之使用Socket實(shí)現(xiàn)傳遞圖片

    Java聊天室之使用Socket實(shí)現(xiàn)傳遞圖片

    這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之使用Socket實(shí)現(xiàn)傳遞圖片功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10

最新評論

乌什县| 罗田县| 新民市| 尼玛县| 姜堰市| 龙海市| 深州市| 德江县| 峨边| 宜丰县| 马尔康县| 谷城县| 双流县| 徐汇区| 苍南县| 永春县| 乌海市| 克山县| 怀来县| 太湖县| 鄂伦春自治旗| 洮南市| 鸡东县| 民勤县| 马尔康县| 鄱阳县| 抚松县| 额敏县| 辰溪县| 开封县| 东丽区| 皋兰县| 谷城县| 蓝田县| 资中县| 石城县| 拜城县| 江都市| 马尔康县| 兰西县| 马鞍山市|