1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-06 13:42:28 +08:00

feat: add JoinFunc

This commit is contained in:
dudaodong
2024-10-24 14:56:13 +08:00
parent 921f218ef7
commit 2015d36b08
5 changed files with 126 additions and 0 deletions

View File

@@ -106,6 +106,8 @@ import (
- [RightPadding](#RightPadding)
- [LeftPadding](#LeftPadding)
- [Frequency](#Frequency)
- [JoinFunc](#JoinFunc)
<div STYLE="page-break-after: always;"></div>
@@ -2984,4 +2986,34 @@ func main() {
// Output:
// map[a:1 b:2 c:3]
}
```
### <span id="JoinFunc">JoinFunc</span>
<p>将切片元素用给定的分隔符连接成一个单一的字符串。</p>
<b>函数签名:</b>
```go
func JoinFunc[T any](slice []T, sep string, transform func(T) T) string
```
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
```go
import (
"fmt"
"github.com/duke-git/lancet/v2/slice"
)
func main() {
result := slice.JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string {
return strings.ToUpper(s)
})
fmt.Println(result)
// Output:
// A, B, C
}
```

View File

@@ -2979,4 +2979,34 @@ func main() {
// Output:
// map[a:1 b:2 c:3]
}
```
### <span id="JoinFunc">JoinFunc</span>
<p>Joins the slice elements into a single string with the given separator.</p>
<b>Signature:</b>
```go
func JoinFunc[T any](slice []T, sep string, transform func(T) T) string
```
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
```go
import (
"fmt"
"github.com/duke-git/lancet/v2/slice"
)
func main() {
result := slice.JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string {
return strings.ToUpper(s)
})
fmt.Println(result)
// Output:
// A, B, C
}
```

View File

@@ -1398,3 +1398,16 @@ func Frequency[T comparable](slice []T) map[T]int {
return result
}
// JoinFunc joins the slice elements into a single string with the given separator.
// Play: todo
func JoinFunc[T any](slice []T, sep string, transform func(T) T) string {
var buf strings.Builder
for i, v := range slice {
if i > 0 {
buf.WriteString(sep)
}
buf.WriteString(fmt.Sprint(transform(v)))
}
return buf.String()
}

View File

@@ -1261,3 +1261,14 @@ func ExampleFrequency() {
// Output:
// map[a:1 b:2 c:3]
}
func ExampleJoinFunc() {
result := JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string {
return strings.ToUpper(s)
})
fmt.Println(result)
// Output:
// A, B, C
}

View File

@@ -1816,3 +1816,43 @@ func TestFrequency(t *testing.T) {
assert.Equal(expected, result)
})
}
func TestJoinFunc(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestJoinFunc")
t.Run("basic case", func(t *testing.T) {
result := JoinFunc([]int{1, 2, 3}, ", ", func(i int) int {
return i * 2
})
expected := "2, 4, 6"
assert.Equal(expected, result)
})
t.Run("empty slice", func(t *testing.T) {
result := JoinFunc([]int{}, ", ", func(i int) int {
return i * 2
})
assert.Equal("", result)
})
t.Run("single element slice", func(t *testing.T) {
result := JoinFunc([]int{1}, ", ", func(i int) int {
return i * 2
})
assert.Equal("2", result)
})
t.Run("string slice", func(t *testing.T) {
result := JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string {
return strings.ToUpper(s)
})
expected := "A, B, C"
assert.Equal(expected, result)
})
}