- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
维基百科: 函数式编程 ,或称 函数程序设计 、 泛函编程 (英语:Functional programming),是一种 编程范型 ,它将 电脑运算 视为 函数 运算,并且避免使用程序 状态 以及 可变物件 .
函数式编程的发展可以追溯到数学家阿隆佐·邱奇(Alonzo Church)在1930年代提出的λ演算。λ演算是一种形式化的计算模型,用于研究计算过程和可计算性。在20世纪后期,函数式编程开始在计算机科学领域崭露头角,成为一种重要的编程范式.
在传统的命令式编程中,程序被视为一系列命令和状态的改变。这种编程范式易于理解和实现,但随着程序规模的增加,代码的复杂性和维护成本也会增加。函数式编程通过使用纯函数和不可变数据来避免副作用,使得代码更容易理解、测试和并行化,进而提高了代码质量和开发效率.
函数式编程有以下主要概念:
函数式编程语言(例如 Haskell、Clojure、Scala)以及支持函数式编程特性的现代编程语言(例如 Java、Python、JavaScript)都受益于这些概念,通过引入函数式编程范式,开发者可以编写更加简洁、清晰和可维护的代码.
函数式编程在不同编程语言中的应用有一些相似之处,但也存在一些细微的差异。以下是对比JAVA、Python、JavaScript和Scala中函数式编程的应用以及函数式编程和传统命令式编程的不同之处:
AVA 函数式编程的特性主要是在 Java 8 引入的新特性,主要包括Lambda 表达式、函数式接口以及Stream API.
Lambda 表达式 是函数式编程的核心特性之一。它是一种匿名函数,允许将函数作为参数传递给其他函数或直接返回一个函数。Lambda 表达式可以使代码更加简洁、灵活,减少冗余代码,并且在集合操作中有着广泛的应用.
// 传统的匿名内部类写法
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello, World!");
函数式接口 : 函数式接口是只包含一个抽象方法的接口,通过 @FunctionalInterface 注解标识。函数式接口用于支持 Lambda 表达式,让开发者可以在不声明新接口的情况下,直接使用已有的接口.
@FunctionalInterface
public interface C300_Function {
int apply(int x, int y);
}
Stream API 提供了一套丰富的函数式操作,用于对集合数据进行过滤、映射、排序、归约等处理。Stream API 避免了显式使用迭代器或循环,使得代码更加简洁和易读.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum();
这儿主要先研究下 @FunctionallInterface 注解 。
在Spring中很多注解(特别是)是通过代理实现的,特别是与 AOP(Aspect-Oriented Programming,面向切面编程)相关的注解。 Spring 使用代理来实现 AOP 的横切关注点,比如事务管理、日志记录等。,但上述这个接口只是用来起标识作用,当接口被这个注解标识的话那么就只能有一个抽象方法接口,目的是为了保证接口的设计人员在接口中添加多个抽象方法时能够在编译时得到错误提示。例如一个接口标记了 @FunctionalInterface 注解若它包含多个抽象方法,编译器会报错。一般函数式接口只能有一个抽象方法,并且排除接口默认(default)方法及声明中覆盖Object的公开方法,同时,@FunctionalInterface不能标注在注解、类、枚举上。如果违背以上的原则那么这个接口就不能视为函数式接口,当标注这个注解后编译会报错, 不过任何一个接口满足上述函数式接口的要求后,无论接口上是否添加 @FunctionallInterface 注解都能被编译器视为函数式接口。无论是哪一种注解其实都是数据流转对象.
An informative annotation type used to indicate that an interface type declaration is intended to be a functional interface as defined by the Java Language Specification. Conceptually, a functional interface has exactly one abstract method. Since default methods have an implementation, they are not abstract. If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere. 。
一种信息类的注解类型,用于接口类型声明,旨在成为 Java 语言规范定义的功能性接口。从概念上讲,函数接口只能有一个抽象方法。但由于默认方法已经被实现,所以它们不是抽象的。如果接口声明了一个覆盖java.lang.Object公共方法之一的抽象方法,则该方法也不计入接口的抽象方法计数,因为该接口的任何实现都将具有来自java.lang.Object或其他地方的实现.
例如:
@FunctionalInterface
public interface C301_FunctionalInterface {
/**
* 重写的方法不算,因为会默认调用其继承父类的这个方法
*/
@Override
String toString();
/**
* default方法由于会在定义时实现,所以不作为函数式接口唯一的方法的要求
*
* @return String
*/
default String toUpperCase() {
return "toUpperCase";
}
void test();
public static void main(String[] args) {
/**调用之前需要先实现其定义的方法 test(),这个地方也就体现出为啥只能定义一个抽象方法,否则该如何表示实现哪个默认方法呢?*/
C301_FunctionalInterface functionalInterface = () -> {
System.out.println("test");
};
/**调用了其定位的方法*/
functionalInterface.test();
System.out.println(functionalInterface.toUpperCase());
System.out.println(functionalInterface.toString());
}
}
Note that instances of functional interfaces can be created with lambda expressions, method references, or constructor references. If a type is annotated with this annotation type, compilers are required to generate an error message unless: The type is an interface type and not an annotation type, enum, or class. The annotated type satisfies the requirements of a functional interface. However, the compiler will treat any interface meeting the definition of a functional interface as a functional interface regardless of whether or not a FunctionalInterface annotation is present on the interface declaration. 。
请注意,可以使用 lambda 表达式、方法引用或构造函数引用创建函数接口的实例。此类型可以作用的对象是该类型是接口,而不能注解、枚举,否则编译器会生成错误消息 ,带注解的类型满足功能接口的要求。但是,无论是否使用这个注解,只需要接口满足函数式接口的要求都可以被编译器视为函数式接口.
位于 java.util.function.Supplier<T> ,它在 Java 8 中引入。该接口代表一个供给型接口,它不接受任何参数,返回一个类型为 T 的结果。该接口有一个抽象方法 T get() ,用于获取结果,数据提供类型, 特点是只出不进,一般作为方法、构造参数,方法返回值.
/**
* Represents a supplier of results.
*
* <p>There is no requirement that a new or distinct result be returned each
* time the supplier is invoked.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #get()}.
*
* @param <T> the type of results supplied by this supplier
*
* @since 1.8
*/
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
示例使用 Supplier 接口:
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
Supplier<String> messageSupplier = () -> "Hello, World!";
String message = messageSupplier.get();
System.out.println(message); // 输出:Hello, World!
}
}
在上面的示例中,我们使用了 Supplier<String> 函数式接口创建了一个供给型对象 messageSupplier ,它返回一个固定的字符串 "Hello, World!"。然后通过调用 messageSupplier.get() 方法获取供给型对象的结果.
它代表了一个消费型接口。Consumer 接口接受一个参数,但没有返回值。该接口有一个抽象方法 void accept(T t) ,用于执行接受到的参数的操作。Consumer 接口通常用于对某个对象或值进行处理,例如打印输出、写入文件、发送消息等操作。由于没有返回值,Consumer 接口更多地用于执行一些操作,而不是产生一个结果。数据是只进不出,一般是作为方法参数或者构造器 。
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
/**
* Returns a composed {@code Consumer} that performs, in sequence, this
* operation followed by the {@code after} operation. If performing either
* operation throws an exception, it is relayed to the caller of the
* composed operation. If performing this operation throws an exception,
* the {@code after} operation will not be performed.
*
* @param after the operation to perform after this operation
* @return a composed {@code Consumer} that performs in sequence this
* operation followed by the {@code after} operation
* @throws NullPointerException if {@code after} is null
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
案例 。
public class C303_Consumer {
public static void main(String[] args) {
Consumer consumer = System.out::println;
Consumer<String> consumer2 = C303_Consumer::println;
// 轮流消费
consumer2.andThen(consumer).andThen(consumer2).andThen(consumer2).accept("hello world2");
consumer.accept("hello world1");
}
public static void println(String message){
System.out.println("println:"+message);
}
}
打印结果:
println:hello world2
hello world2
println:hello world2
println:hello world2
hello world1
数据转换类型,是一个函数式接口,它代表了一个函数,该函数接受一个参数类型为 T 的输入,并返回一个参数类型为 R 的结果。Function 接口有一个抽象方法 R apply(T t) ,用于执行函数的逻辑,将输入类型 T 转换为输出类型 R.
Function 接口常用于对一个对象或值进行转换、映射或计算,并返回一个结果。它将一个类型的数据映射到另一个类型,常用于对集合的处理、数据转换等场景.
示例使用 Function 接口:
public class C304_Function {
public static void main(String[] args) {
/**示例一:将入参为String转为Integer类型返回*/
Function <String,Integer> function1 = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
System.out.println("function1");
return Integer.parseInt(s);
}
};
/**通过Function里面的apply函数调用*/
// System.out.println(function1.apply("123"));
/**示例二:将入参为Integer转为String类型返回*/
Function<Integer,String> function2 = new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
System.out.println("function2");
return String.valueOf(integer);
}
};
/**示例三:将入参为String转为String类型返回*/
Function<String,String> function3 = new Function<String, String>() {
@Override
public String apply(String string) {
System.out.println("function3");
return String.valueOf(string);
}
};
// 执行循序:fun2 -> fun3 -> fun1
Integer apply = function1.compose(function3).compose(function2).apply(123456);
}
}
打印结果:
function2
function3
function1
Function 接口在 Java 中广泛用于集合框架的操作,例如 List 的 map() 方法接受一个 Function 对象作为参数,用于对集合中的每个元素进行映射转换。另外,在 Stream API 中也经常使用 Function 接口进行数据转换和处理.
示例使用 Function 接口处理集合元素:
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用 Function 接口处理集合元素
Function<String, Integer> nameLengthMapper = name -> name.length();
names.stream()
.map(nameLengthMapper)
.forEach(System.out::println);
}
}
断言类型,Predicate 接口表示一个接收一个参数并返回布尔值的函数。它常用于对集合元素进行过滤或条件判断。Predicate 接口只有一个抽象方法 test(T t) ,其中 test 方法接收一个泛型参数 T ,表示待检查的对象,然后返回一个布尔值,表示是否满足指定条件.
以下是 Predicate 接口的简单示例:
public class C305_Predicate {
/**
* Predicate<T>:这一接口定了一个默认方法:boolean test(T t),这一方法用检查给定的参数是否符合查询检查。
* Predicate<T>接口中有两中重要的方法:and(),or(),negate()。
* Predicate<T>接口中的方法如下:
* and(Predicate<? super T> other):对当前 Predicate 和另一个 Predicate 进行逻辑与操作。
* or(Predicate<? super T> other):对当前 Predicate 和另一个 Predicate 进行逻辑或操作。
* negate():返回当前 Predicate 的逻辑非。
* 下面是使用 Predicate 进行条件组合的示例:
*/
public static void main(String[] args) {
//能够被2整除
Predicate<Integer> dividedTwo = new Predicate<Integer>() {
@Override
public boolean test(Integer o) {
return o % 2 == 0;
}
};
//能够被3整除
Predicate<Integer> dividedThree = o -> o % 3 == 0;
//能够被5整除
Predicate<Integer> dividedFive = o -> o % 5 == 0;
//Predicate 支持多种逻辑操作,可以通过 and、or、negate 等方法将多个 Predicate 进行组合,形成更复杂的条件。
// and使用:true
System.out.println(dividedTwo.and(dividedThree).and(dividedFive).test(30));
// or使用:false
System.out.println(dividedTwo.and(dividedThree).or(dividedFive).test(3));
// negate使用:true
System.out.println((dividedTwo.and(dividedThree).or(dividedFive)).negate().test(3));
}
}
Function作过滤函数 。
/**
* 过滤函数,将集合内满足一定条件的元素返回
*
* @param sourece 源数据集合
* @param predicate 处理函数Function
* @param <T>
* @return 满足断言的所有数据源集合
* TODO: 我这儿用一个List接收,我理解这不够抽象
*/
public static <T> Collection<T> filter_1(Collection<? extends T> sourece, Function<T, Boolean> predicate) {
Collection<T> temp = new ArrayList<T>();
for (T t : sourece) {
if (predicate.apply(t)) {
temp.add(t);
}
}
return Collections.unmodifiableCollection(temp);
}
断言作过滤函数 。
/**
* @param sourece 输入数据集合
* @param predicate 断言
* @param <E> 泛型
* @return
*/
public static <E> Collection<E> filter_2(Collection<? extends E> sourece, Predicate<E> predicate) {
Collection<E> temp = new ArrayList<E>();
for (E t : sourece) {
if (predicate.test(t)) {
temp.add(t);
}
}
return Collections.unmodifiableCollection(temp);
}
// 调用
public static void testFilter_2() {
Collection<Integer> collection = filter_2(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (Integer i) -> {
return i % 2 == 0;
});
System.out.println(collection);
}
JAVA中并没有具体的Action类型,但是有一些操作有Action的作用,例如:
public class C3_06_Action {
public static void main(String[] args) {
// 匿名内置类实现
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("定时任务执行");
}
};
Thread thread = new Thread(runnable);
// invokeDynamic指令实现的(反汇编)
// MethodHandle
Runnable r = () -> System.out.println("定时任务执行");
Thread t = new Thread(r);
}
}
Stream是用于对集合(Collection)进行处理和操作的工具,让我们能够以声明式的方式进行数据的转换、过滤、映射等操作。 Stream 可以看作是对集合进行高级迭代和函数式处理的工具,它提供了一种更现代、更简洁的方式来操作数据,使得代码更加清晰、易读、易维护.
Stream API 提供了一系列操作,这些操作分为两类:
filter
、 map
、 distinct
、 sorted
、 limit
、 skip
等。 forEach
、 collect
、 count
、 reduce
、 min
、 max
、 anyMatch
、 allMatch
、 noneMatch
等。 !!一般不会将Stream作为参数进行传递,但是如果有Stream作为参数进行传递的话,一定要进行串行与并行的判断,并且根据实际情况进行切换 。
/**
* Returns an equivalent stream that is sequential. May return
* itself, either because the stream was already sequential, or because
* the underlying stream state was modified to be sequential.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @return a sequential stream
*/
S sequential();
/**
* Returns an equivalent stream that is parallel. May return
* itself, either because the stream was already parallel, or because
* the underlying stream state was modified to be parallel.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @return a parallel stream
*/
S parallel();
示例使用 Stream API:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eva");
// 使用 Stream API 对集合进行操作
long count = names.stream()
.filter(name -> name.length() <= 4)
.map(String::toUpperCase)
.sorted()
.count();
System.out.println(count); // 输出:4
}
}
在上面的示例中,我们使用 Stream API 对集合 names 进行一系列的操作:首先用 filter 过滤掉长度大于 4 的字符串,然后用 map 将字符串转换为大写,接着用 sorted 进行排序,最后用 count 终端操作统计符合条件的元素个数.
Stream API 的优势在于它具有懒加载的特性,即只有当终端操作触发时,中间操作才会执行。这使得 Stream 在处理大量数据时,能够有效地提高性能和资源利用率.
sorted的应用 。
public class C03_08_Stream {
public static void main(String[] args) {
sorted(Integer::compareTo, Arrays.asList(5, 1, 5, 4, 8, 9, 6, 5, 4, 8, 5, 4, 2, 3, 4)).stream().distinct().forEach(System.out::println);
}
/**
* sorted<Comparator<? super T> comparator>的使用
* @param comparator 比较器
* @param collection 待排序的集合
* @param <T>
* @return 排序后的集合
*/
private static <T> Collection<T> sorted(Comparator<T> comparator, Collection<T> collection) {
return collection.stream().sorted(comparator).collect(Collectors.toList());
}
}
map的应用 。
map主要是做一个映射,例如这就是将Integer类型转换成Long类型 。
reduce主要是合并操作,例如将这将多个元素求和 。
/**
* Stream 的 map<Function>操作
*
* @param integers
*/
private static void count(Integer... integers) {
Stream.of(integers)
.map(Long::valueOf)
.reduce(Long::sum)
.ifPresent(System.out::println);
}
并行parallel 。
/**
* 并行parallel案例
* @param integers
*/
private static void parallelSort(Integer... integers){
Stream.of(integers).sorted(Integer::compareTo).parallel().forEach(C03_08_Stream::println);
}
public static void println(Object obj){
System.out.printf("[%s]:%s \n",Thread.currentThread().getName(),obj);
}
打印结果 。
[main]:7
[ForkJoinPool.commonPool-worker-2]:1
[ForkJoinPool.commonPool-worker-2]:4
[ForkJoinPool.commonPool-worker-9]:8
[ForkJoinPool.commonPool-worker-6]:3
[ForkJoinPool.commonPool-worker-13]:6
[ForkJoinPool.commonPool-worker-15]:5
[ForkJoinPool.commonPool-worker-4]:9
[ForkJoinPool.commonPool-worker-11]:2
[main]:1
这个默认创建系统设置的线程数(NUMBER_OF_PROCESSORS) 。
/**collect的使用案例
* @param integers
* @return
*/
public static List<Integer> collect(Integer... integers){
List<Integer> collect = Stream.of(integers).collect(Collectors.toList());
List<Integer> collect2 = Stream.of(integers).collect(LinkedList::new,LinkedList::add,LinkedList::addAll);
return collect;
}
一般是处理一些降维的需求,例如List<List<Klass>> -- > List<Klass> 。
static class Klass {
private String name;
public Klass(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Klass{" +
"name='" + name + '\'' +
'}';
}
}
static class KlassGroup {
private List<Klass> group = new ArrayList<>();
public KlassGroup(Klass... klass) {
group.addAll(Arrays.asList(klass));
}
public List<Klass> getGroup() {
return group;
}
}
// 现在要做的一件事是如果有多个List<Klass>想合并成一个List<Klass>
/**
* 关于flatMap的使用
* @param klassLoist
* @return
*/
public static List<Klass> mergeKlass(List<List<Klass>> klassLoist){
return klassLoist.stream().flatMap(Collection::stream).collect(Collectors.toList());
}
尽管函数式编程在很多场景下提供了很多优势,但它也有一些局限性:
学习曲线:对于习惯了命令式编程范式的开发者来说,切换到函数式编程需要适应新的思维方式和编程习惯。函数式编程的概念和特性可能对初学者来说较为陌生,需要一定的学习和实践才能熟练掌握.
性能问题:虽然函数式编程提倡不可变数据和纯函数,但有时候为了实现函数式编程的特性,可能需要引入额外的对象拷贝或数据结构转换,导致一定的性能损失。对于一些性能敏感的场景,可能需要权衡是否使用函数式编程.
可读性问题:虽然函数式编程鼓励使用更简洁、声明式的代码,但对于复杂的业务逻辑,过度使用函数式编程可能会导致代码的可读性下降,增加理解的难度.
嵌套问题:函数式编程中的函数组合、嵌套等特性,可能导致代码的层级嵌套过深,降低代码的可读性和可维护性.
现有项目兼容性:对于现有的项目,特别是老旧项目,可能由于历史原因和架构设计,不太容易完全引入函数式编程的特性,可能需要进行较大的重构.
并发处理复杂性:函数式编程鼓励不可变数据和纯函数,这在并发处理时可以避免一些线程安全问题。但对于复杂的并发场景,函数式编程的特性可能会增加代码的复杂性,需要谨慎处理.
最后此篇关于JAVA函数式编程的文章就讲到这里了,如果你想了解更多关于JAVA函数式编程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试打印 timeval 类型的值。实际上我可以打印它,但我收到以下警告: 该行有多个标记 格式“%ld”需要“long int”类型,但参数 2 的类型为“struct timeval” 程序
我正在编写自己的 unix 终端,但在执行命令时遇到问题: 首先,我获取用户输入并将其存储到缓冲区中,然后我将单词分开并将它们存储到我的 argv[] 数组中。IE命令是“firefox”以启动存储在
我是 CUDA 的新手。我有一个关于一个简单程序的问题,希望有人能注意到我的错误。 __global__ void ADD(float* A, float* B, float* C) { con
我有一个关于 C 语言 CGI 编程的一般性问题。 我使用嵌入式 Web 服务器来处理 Web 界面。为此,我在服务器中存储了一个 HTML 文件。在此 HTML 文件中包含 JavaScript 和
**摘要:**在代码的世界中,是存在很多艺术般的写法,这可能也是部分程序员追求编程这项事业的内在动力。 本文分享自华为云社区《【云驻共创】用4种代码中的艺术试图唤回你对编程的兴趣》,作者: break
我有一个函数,它的任务是在父对象中创建一个变量。我想要的是让函数在调用它的级别创建变量。 createVariable testFunc() [1] "test" > testFunc2() [1]
以下代码用于将多个连续的空格替换为1个空格。虽然我设法做到了,但我对花括号的使用感到困惑。 这个实际上运行良好: #include #include int main() { int ch, la
我正在尝试将文件写入磁盘,然后自动重新编译。不幸的是,某事似乎不起作用,我收到一条我还不明白的错误消息(我是 C 初学者 :-)。如果我手动编译生成的 hello.c,一切正常吗?! #include
如何将指针值传递给结构数组; 例如,在 txt 上我有这个: John Doe;xxxx@hotmail.com;214425532; 我的代码: typedef struct Person{
我尝试编写一些代码来检索 objectID,结果是 2B-06-01-04-01-82-31-01-03-01-01 . 这个值不正确吗? // Send a SysObjectId SNMP req
您好,提前感谢您的帮助, (请注意评论部分以获得更多见解:即,以下示例中的成本列已添加到此问题中;西蒙提供了一个很好的答案,但成本列本身并未出现在他的数据响应中,尽管他提供的功能与成本列一起使用) 我
我想知道是否有人能够提出一些解决非线性优化问题的软件包的方法,而非线性优化问题可以为优化解决方案提供整数变量?问题是使具有相等约束的函数最小化,该函数受某些上下边界约束的约束。 我已经在R中使用了'n
我是 R 编程的初学者,正在尝试向具有 50 列的矩阵添加一个额外的列。这个新列将是该行中前 10 个值的平均值。 randomMatrix <- generateMatrix(1,5000,100,
我在《K&R II C 编程 ANSI C》一书中读到,“>>”和“0; nwords--) sum += *buf++; sum = (sum >>
当下拉列表的选择发生变化时,我想: 1) 通过 div 在整个网站上显示一些 GUI 阻止覆盖 2)然后处理一些代码 3) 然后隐藏叠加层。 问题是,当我在事件监听器函数中编写此逻辑时,将执行 onC
我正在使用 Clojure 和 RESTEasy 设计 JAX-RS REST 服务器. 据我了解,用 Lisp 系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地构建为“特定于领域的语
我目前正在研究一种替代出勤监控系统作为一项举措。目前,我设计的用户表单如下所示: Time Stamp Userform 它的工作原理如下: 员工将选择他/她将使用的时间戳类型:开始时间、超时、第一次
我是一名学生,试图自学编程,从在线资源和像您这样的人那里获得帮助。我在网上找到了一个练习来创建一个小程序来执行此操作: 编写一个程序,读取数字 a 和 b(长整型)并列出 a 和 b 之间有多少个数字
我正在尝试编写一个 shell 程序,给定一个参数,打印程序的名称和参数中的每个奇数词(即,不是偶数词)。但是,我没有得到预期的结果。在跟踪我的程序时,我注意到,尽管奇数词(例如,第 5 个词,5 %
只是想知道是否有任何 Java API 可以让您控制台式机/笔记本电脑外壳上的 LED? 或者,如果不可能,是否有可能? 最佳答案 如果你说的是前面的 LED 指示电源状态和 HDD 繁忙状态,恐怕没
我是一名优秀的程序员,十分优秀!