根据List中单个对象的某方法进行去重

public static void main(String[] args){
		List<TQxtjEntity> list = new ArrayList<TQxtjEntity>();
		TQxtjEntity t1 = new TQxtjEntity("n1","1");
		TQxtjEntity t2 = new TQxtjEntity("n2","2");
		TQxtjEntity t3 = new TQxtjEntity("n2","2");
		TQxtjEntity t4 = new TQxtjEntity("n3","2");
		TQxtjEntity t5 = new TQxtjEntity("n1","3");
		TQxtjEntity t6 = new TQxtjEntity("n1","3");
		list.add(t1);
		list.add(t2);
		list.add(t3);
		list.add(t4);
		list.add(t5);
		list.add(t6);
		List<TQxtjEntity> li = removeRepeat(list,"com.kingtopinfo.qxgl.entity.TQxtjEntity","getName");
		System.out.println(li.size());
	}
	/**
	 * 根据oldList中单个对象的某方法进行去重
	 * @param oldList
	 * @param className
	 * @param methodName
	 * @return
	 */
	private static <T> List<T> removeRepeat(List<T> oldList,String classALLName,String methodName){
		try {
			//①找到类:
			Class cl = Class.forName(classALLName);
			//②创建对象(要求这个类中含有空参数的构造方法):
			Object obj = cl.newInstance();
			//③根据名称和参数找方法:
			Method method1 = cl.getMethod(methodName);
			//④在某个对象上面执行方法,
			//Object result = method1.invoke(obj);
			
			List<T> newList = new ArrayList<T>();
			for(int i=0; i<oldList.size(); i++)
			{
				boolean tf = false;
				for(int j=0; j<newList.size(); j++){
					if(method1.invoke(newList.get(j)).equals(method1.invoke(oldList.get(i)))){
						tf = true;
						break;
					}
				}
				if(!tf){
					newList.add(oldList.get(i));
				}
			}
			return newList;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}


修改::Testing started at 下午6:35 ... Launching pytest with arguments C:\Users\Administrator\Desktop\project\core\event_center.py --no-header --no-summary -q in C:\Users\Administrator\Desktop\project\core ============================= test session starts ============================= collecting ... collected 0 items ============================ no tests ran in 0.32s ============================ 进程已结束,退出代码为 5 空套件 代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 优化后的事件中心模块 (最终版) """ import logging import threading import uuid import time from enum import Enum, auto from typing import Tuple, Dict, List, Callable, Optional, Any, Set, DefaultDict, Union from collections import defaultdict from dataclasses import dataclass, field from concurrent.futures import ThreadPoolExecutor # 初始化日志 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) class EventType(Enum): """完整事件类型枚举(合并基础版和增强版)""" # 基础事件类型 MODULE_RUN = auto() ANALYSIS_RESULT = auto() MODULE_ERROR = auto() REGISTER_UI = auto() GET_RESULTS = auto() # 系统事件 SYSTEM_STARTUP = auto() SYSTEM_SHUTDOWN = auto() MODULE_READY = auto() ERROR = auto() # 模块特定事件 INPUT_ANALYSIS_START = auto() INPUT_ANALYSIS_END = auto() COMBINATION_ANALYSIS_START = auto() COMBINATION_ANALYSIS_END = auto() FOLLOW_ANALYSIS_START = auto() FOLLOW_ANALYSIS_UPDATE = auto() TREND_ANALYSIS_REQUEST = auto() TREND_ANALYSIS_REPORT = auto() NUMBER_GENERATION_START = auto() NUMBER_GENERATION_FINISH = auto() # 测试事件 TEST_EVENT = auto() @dataclass class Event: """事件数据类""" type: Union[str, EventType] # 必须放在非默认参数位置 source: str # 必须放在非默认参数位置 target: Optional[str] = None event_id: str = field(default_factory=lambda: str(uuid.uuid4())) token: Optional[str] = None data: Optional[Dict[str, Any]] = field(default_factory=dict) timestamp: float = field(default_factory=time.time) def __post_init__(self): """数据验证和类型转换""" if isinstance(self.type, EventType): self.type = self.type.name if not isinstance(self.type, str) or not self.type: raise ValueError("type 必须是非空字符串或EventType枚举") class EventCenter: """线程安全的事件中心(最终优化版)""" _instance = None _lock = threading.Lock() _executor = ThreadPoolExecutor(max_workers=10, thread_name_prefix="EventWorker") def __new__(cls): with cls._lock: if cls._instance is None: cls._instance = super().__new__(cls) cls._instance.__initialized = False return cls._instance def __init__(self): """初始化事件中心(单例模式)""" if getattr(self, '__initialized', False): return self.__initialized = True self._subscribers: DefaultDict[str, List[Tuple[Callable[[Event], None], Optional[str]]]] = defaultdict(list) self._event_history: Dict[str, Event] = {} self._pending_acks: Set[str] = set() self._ack_timeout = 5.0 self._stats = { 'total_events': 0, 'failed_events': 0, 'delivered_events': 0 } def subscribe(self, event_type: Union[str, EventType], handler: Callable[[Event], None], token: Optional[str] = None) -> None: """订阅事件(支持token过滤)""" event_type_str = event_type.name if isinstance(event_type, EventType) else str(event_type) with self._lock: self._subscribers[event_type_str].append((handler, token)) logger.debug(f"已订阅事件: {event_type_str}, token: {token}") def unsubscribe(self, event_type: Union[str, EventType], handler: Callable[[Event], None]) -> bool: """取消订阅事件""" event_type_str = event_type.name if isinstance(event_type, EventType) else str(event_type) with self._lock: if event_type_str not in self._subscribers: return False before = len(self._subscribers[event_type_str]) self._subscribers[event_type_str] = [ (h, t) for h, t in self._subscribers[event_type_str] if h != handler ] removed = before != len(self._subscribers[event_type_str]) if removed: logger.debug(f"已取消订阅: {event_type_str}") return removed def publish(self, event, require_ack=False, async_handle=True) -> bool: """发布事件(支持同步/异步处理)""" # 验证事件数据 - 使用更精确的异常处理 try: # 确保事件对象有 __post_init__ 方法 if hasattr(event, '__post_init__'): event.__post_init__() else: logger.warning("事件对象缺少验证方法 __post_init__") except (ValueError, TypeError) as e: # 只捕获预期的验证错误 logger.error(f"事件验证失败: {e}") with self._lock: self._stats['failed_events'] += 1 return False except Exception as e: # 记录但继续处理其他意外错误 logger.exception(f"事件验证过程中发生意外错误: {e}") # 主事件处理逻辑 try: with self._lock: if event.event_id in self._event_history: logger.warning(f"复事件ID: {event.event_id}") return False self._event_history[event.event_id] = event self._stats['total_events'] += 1 if require_ack: self._pending_acks.add(event.event_id) handlers = self._get_matching_handlers(event) if not handlers: logger.debug(f"没有处理器订阅: {event.type}") return True if async_handle: self._executor.submit(self._dispatch_event, event, handlers, require_ack) else: self._dispatch_event(event, handlers, require_ack) return True except (KeyError, AttributeError) as e: # 处理内部数据结构错误 logger.error(f"内部数据结构错误: {e}") return False except Exception as e: # 捕获所有其他异常但继续运行 logger.exception(f"发布事件时发生未预期错误: {e}") return False def _get_matching_handlers(self, event: Event) -> List[Callable[[Event], None]]: """获取匹配的事件处理器""" with self._lock: return [ h for h, t in self._subscribers.get(event.type, []) if t is None or t == event.token ] def _dispatch_event(self, event: Event, handlers: List[Callable[[Event], None]], require_ack: bool) -> None: """分发事件到处理器""" for handler in handlers: try: handler(event) self._stats['delivered_events'] += 1 logger.debug(f"事件处理成功: {event.event_id[:8]}") except Exception as e: logger.exception(f"处理器异常: {e}") if require_ack and event.target: self._wait_for_ack(event) def _wait_for_ack(self, event: Event) -> None: """等待事件确认""" start = time.time() while time.time() - start < self._ack_timeout: with self._lock: if event.event_id not in self._pending_acks: return time.sleep(0.05) logger.warning(f"事件确认超时: {event.event_id[:8]}") def get_stats(self) -> Dict[str, int]: """获取事件中心统计信息""" with self._lock: return self._stats.copy() # 全局单例实例 event_center = EventCenter() # 测试代码 if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) def test_handler(event: Event): print(f"处理测试事件: {event.event_id[:8]}, 数据: {event.data}") time.sleep(0.1) # 测试订阅和发布 event_center.subscribe(EventType.TEST_EVENT, test_handler) test_event = Event( type=EventType.TEST_EVENT, source="test_script", data={"message": "Hello EventCenter"}, token="test_token" ) event_center.publish(test_event) time.sleep(0.5) # 测试统计功能 print("事件中心统计:", event_center.get_stats())
08-20
在 Java 中,使用 Stream 流提取 `List` 中单个属性之和可以根据属性的类型采用不同的方法。以下分不同类型给出示例: ### 数值类型属性求和 假设 `List` 中存储的是自定义对象对象有一个数值类型的属性,例如 `int` 或 `double`,可以使用 `mapToInt`、`mapToDouble` 等方法对象流转换为数值流,然后使用 `sum` 方法求和。 ```java import java.util.Arrays; import java.util.List; class Person { private int age; public Person(int age) { this.age = age; } public int getAge() { return age; } } public class Main { public static void main(String[] args) { List<Person> personList = Arrays.asList( new Person(20), new Person(25), new Person(30) ); // 计算所有人的年龄总和 int totalAge = personList.stream() .mapToInt(Person::getAge) .sum(); System.out.println("所有人的年龄总和: " + totalAge); } } ``` ### 非数值类型属性求和(转换为数值类型) 如果属性不是数值类型,但可以转换为数值类型,例如 `String` 类型存储的是数字字符串,需要先将其转换为数值类型,再进行求和。 ```java import java.util.Arrays; import java.util.List; class Product { private String priceStr; public Product(String priceStr) { this.priceStr = priceStr; } public String getPriceStr() { return priceStr; } } public class Main { public static void main(String[] args) { List<Product> productList = Arrays.asList( new Product("10.5"), new Product("20.3"), new Product("30.7") ); // 计算所有产品的价格总和 double totalPrice = productList.stream() .mapToDouble(p -> Double.parseDouble(p.getPriceStr())) .sum(); System.out.println("所有产品的价格总和: " + totalPrice); } } ``` ### 相关问题 1. 使用 Stream 流提取 `List` 中单个属性的平均值该怎么做? 2. 如何使用 Stream 流提取 `List` 中单个属性的最大值和最小值? 3. 如果 `List` 中的属性有缺失值,使用 Stream 流求和时该如何处理? 4. 对于嵌套对象的属性,怎样使用 Stream 流进行求和操作? 5. Stream 流求和操作在性能上与传统的 `for` 循环求和相比如何?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值